forked from bartvdbraak/blender
svn merge ^/trunk/blender -r48691:48729
This commit is contained in:
commit
1bca7fe492
@ -4223,6 +4223,10 @@ Game Types (bge.types)
|
|||||||
|
|
||||||
This camera's 4x4 projection matrix.
|
This camera's 4x4 projection matrix.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This is the identity matrix prior to rendering the first frame (any Python done on frame 1).
|
||||||
|
|
||||||
:type: 4x4 Matrix [[float]]
|
:type: 4x4 Matrix [[float]]
|
||||||
|
|
||||||
.. attribute:: modelview_matrix
|
.. attribute:: modelview_matrix
|
||||||
@ -4233,7 +4237,7 @@ Game Types (bge.types)
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
This matrix is regenerated every frame from the camera's position and orientation.
|
This matrix is regenerated every frame from the camera's position and orientation. Also, this is the identity matrix prior to rendering the first frame (any Python done on frame 1).
|
||||||
|
|
||||||
.. attribute:: camera_to_world
|
.. attribute:: camera_to_world
|
||||||
|
|
||||||
|
@ -419,8 +419,8 @@ GHOST_WindowX11(
|
|||||||
x_image = XCreateImage(display, m_visual->visual, 24, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 32, 0);
|
x_image = XCreateImage(display, m_visual->visual, 24, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 32, 0);
|
||||||
mask_image = XCreateImage(display, m_visual->visual, 1, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 8, 0);
|
mask_image = XCreateImage(display, m_visual->visual, 1, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 8, 0);
|
||||||
|
|
||||||
x_image->data = (char *)malloc(x_image->bytes_per_line * BLENDER_ICON_HEIGHT);
|
x_image->data = (char *)calloc(x_image->bytes_per_line * BLENDER_ICON_HEIGHT, 1);
|
||||||
mask_image->data = (char *)malloc(mask_image->bytes_per_line * BLENDER_ICON_HEIGHT);
|
mask_image->data = (char *)calloc(mask_image->bytes_per_line * BLENDER_ICON_HEIGHT, 1);
|
||||||
|
|
||||||
/* copy the BLENDER_ICON_48x48x24 into the XImage */
|
/* copy the BLENDER_ICON_48x48x24 into the XImage */
|
||||||
unsigned char *col = BLENDER_ICON_48x48x24;
|
unsigned char *col = BLENDER_ICON_48x48x24;
|
||||||
@ -429,7 +429,11 @@ GHOST_WindowX11(
|
|||||||
for (py = 0; py < BLENDER_ICON_HEIGHT; py++, col += 3) {
|
for (py = 0; py < BLENDER_ICON_HEIGHT; py++, col += 3) {
|
||||||
/* mask out pink */
|
/* mask out pink */
|
||||||
if (col[0] == 255 && col[1] == 0 && col[2] == 255) {
|
if (col[0] == 255 && col[1] == 0 && col[2] == 255) {
|
||||||
|
#if 0
|
||||||
|
/* instead, use calloc above */
|
||||||
|
XPutPixel(x_image, px, py, 0); /* avoid uninitialized memory, otherwise not needed */
|
||||||
XPutPixel(mask_image, px, py, 0);
|
XPutPixel(mask_image, px, py, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
XPutPixel(x_image, px, py, (col[0] << 16) + (col[1] << 8) + col[2]);
|
XPutPixel(x_image, px, py, (col[0] << 16) + (col[1] << 8) + col[2]);
|
||||||
@ -1143,7 +1147,6 @@ GHOST_TSuccess GHOST_WindowX11::setState(GHOST_TWindowState state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
GHOST_TSuccess
|
GHOST_TSuccess
|
||||||
GHOST_WindowX11::
|
GHOST_WindowX11::
|
||||||
|
@ -63,14 +63,6 @@
|
|||||||
#include <stdio.h> /* needed for FILE* */
|
#include <stdio.h> /* needed for FILE* */
|
||||||
#include "MEM_sys_types.h" /* needed for uintptr_t */
|
#include "MEM_sys_types.h" /* needed for uintptr_t */
|
||||||
|
|
||||||
#ifndef WARN_UNUSED
|
|
||||||
# ifdef __GNUC__
|
|
||||||
# define WARN_UNUSED __attribute__((warn_unused_result))
|
|
||||||
# else
|
|
||||||
# define WARN_UNUSED
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -78,14 +70,17 @@ extern "C" {
|
|||||||
/** Returns the length of the allocated memory segment pointed at
|
/** Returns the length of the allocated memory segment pointed at
|
||||||
* by vmemh. If the pointer was not previously allocated by this
|
* by vmemh. If the pointer was not previously allocated by this
|
||||||
* module, the result is undefined.*/
|
* module, the result is undefined.*/
|
||||||
size_t MEM_allocN_len(void *vmemh) WARN_UNUSED;
|
size_t MEM_allocN_len(void *vmemh)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release memory previously allocatred by this module.
|
* Release memory previously allocatred by this module.
|
||||||
*/
|
*/
|
||||||
short MEM_freeN(void *vmemh);
|
short MEM_freeN(void *vmemh);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return zero if memory is not in allocated list
|
* Return zero if memory is not in allocated list
|
||||||
*/
|
*/
|
||||||
@ -94,30 +89,57 @@ extern "C" {
|
|||||||
/**
|
/**
|
||||||
* Duplicates a block of memory, and returns a pointer to the
|
* Duplicates a block of memory, and returns a pointer to the
|
||||||
* newly allocated block. */
|
* newly allocated block. */
|
||||||
void *MEM_dupallocN(void *vmemh) WARN_UNUSED;
|
void *MEM_dupallocN(void *vmemh)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reallocates a block of memory, and returns pointer to the newly
|
* Reallocates a block of memory, and returns pointer to the newly
|
||||||
* allocated block, the old one is freed. this is not as optimized
|
* allocated block, the old one is freed. this is not as optimized
|
||||||
* as a system realloc but just makes a new allocation and copies
|
* as a system realloc but just makes a new allocation and copies
|
||||||
* over from existing memory. */
|
* over from existing memory. */
|
||||||
void *MEM_reallocN(void *vmemh, size_t len) WARN_UNUSED;
|
void *MEM_reallocN(void *vmemh, size_t len)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((alloc_size(2)))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate a block of memory of size len, with tag name str. The
|
* Allocate a block of memory of size len, with tag name str. The
|
||||||
* memory is cleared. The name must be static, because only a
|
* memory is cleared. The name must be static, because only a
|
||||||
* pointer to it is stored ! */
|
* pointer to it is stored ! */
|
||||||
void *MEM_callocN(size_t len, const char * str) WARN_UNUSED;
|
void *MEM_callocN(size_t len, const char * str)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
__attribute__((alloc_size(1)))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/** Allocate a block of memory of size len, with tag name str. The
|
/** Allocate a block of memory of size len, with tag name str. The
|
||||||
* name must be a static, because only a pointer to it is stored !
|
* name must be a static, because only a pointer to it is stored !
|
||||||
* */
|
* */
|
||||||
void *MEM_mallocN(size_t len, const char * str) WARN_UNUSED;
|
void *MEM_mallocN(size_t len, const char * str)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
__attribute__((alloc_size(1)))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/** Same as callocN, clears memory and uses mmap (disk cached) if supported.
|
/** Same as callocN, clears memory and uses mmap (disk cached) if supported.
|
||||||
* Can be free'd with MEM_freeN as usual.
|
* Can be free'd with MEM_freeN as usual.
|
||||||
* */
|
* */
|
||||||
void *MEM_mapallocN(size_t len, const char * str) WARN_UNUSED;
|
void *MEM_mapallocN(size_t len, const char * str)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
__attribute__((alloc_size(1)))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/** Print a list of the names and sizes of all allocated memory
|
/** Print a list of the names and sizes of all allocated memory
|
||||||
* blocks. as a python dict for easy investigation */
|
* blocks. as a python dict for easy investigation */
|
||||||
@ -162,7 +184,11 @@ extern "C" {
|
|||||||
void MEM_reset_peak_memory(void);
|
void MEM_reset_peak_memory(void);
|
||||||
|
|
||||||
/** Get the peak memory usage in bytes, including mmap allocations. */
|
/** Get the peak memory usage in bytes, including mmap allocations. */
|
||||||
uintptr_t MEM_get_peak_memory(void) WARN_UNUSED;
|
uintptr_t MEM_get_peak_memory(void)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
const char *MEM_name_ptr(void *vmemh);
|
const char *MEM_name_ptr(void *vmemh);
|
||||||
|
@ -163,6 +163,9 @@ static int malloc_debug_memset = 0;
|
|||||||
/* implementation */
|
/* implementation */
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__ ((format(printf, 1, 2)))
|
||||||
|
#endif
|
||||||
static void print_error(const char *str, ...)
|
static void print_error(const char *str, ...)
|
||||||
{
|
{
|
||||||
char buf[512];
|
char buf[512];
|
||||||
|
@ -25,8 +25,7 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
# XXX Relative import does not work here when used from Blender...
|
# XXX Relative import does not work here when used from Blender...
|
||||||
#from . import settings
|
from bl_i18n_utils import settings
|
||||||
import bl_i18n_utils.settings as settings
|
|
||||||
|
|
||||||
|
|
||||||
#classes = set()
|
#classes = set()
|
||||||
|
@ -100,8 +100,11 @@ PYGETTEXT_KEYWORDS = (() +
|
|||||||
tuple((r"{}\(\s*" + _ctxt_re + r"\s*,\s*"+ _msg_re + r"\s*\)").format(it)
|
tuple((r"{}\(\s*" + _ctxt_re + r"\s*,\s*"+ _msg_re + r"\s*\)").format(it)
|
||||||
for it in ("CTX_IFACE_", "CTX_TIP_", "CTX_N_"))
|
for it in ("CTX_IFACE_", "CTX_TIP_", "CTX_N_"))
|
||||||
)
|
)
|
||||||
#GETTEXT_KEYWORDS = ("IFACE_", "CTX_IFACE_:1c,2", "TIP_", "CTX_TIP_:1c,2",
|
|
||||||
# "N_", "CTX_N_:1c,2")
|
ESCAPE_RE = (
|
||||||
|
('((?<!\\\\)"|(?<!\\\\)\\\\(?!\\\\|"))', r"\\\1"),
|
||||||
|
('\t', r"\\t"),
|
||||||
|
)
|
||||||
|
|
||||||
# Should po parser warn when finding a first letter not capitalized?
|
# Should po parser warn when finding a first letter not capitalized?
|
||||||
WARN_MSGID_NOT_CAPITALIZED = True
|
WARN_MSGID_NOT_CAPITALIZED = True
|
||||||
|
@ -71,6 +71,8 @@ def process_po(po, lang):
|
|||||||
# update po file
|
# update po file
|
||||||
cmd = (GETTEXT_MSGMERGE_EXECUTABLE,
|
cmd = (GETTEXT_MSGMERGE_EXECUTABLE,
|
||||||
"--update",
|
"--update",
|
||||||
|
"-w", "1", # XXX Ugly hack to prevent msgmerge merging
|
||||||
|
# short source comments together!
|
||||||
"--no-wrap",
|
"--no-wrap",
|
||||||
"--backup=none",
|
"--backup=none",
|
||||||
"--lang={}".format(lang),
|
"--lang={}".format(lang),
|
||||||
|
@ -26,7 +26,6 @@ import subprocess
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
#from codecs import open
|
|
||||||
import tempfile
|
import tempfile
|
||||||
import argparse
|
import argparse
|
||||||
import time
|
import time
|
||||||
@ -40,14 +39,11 @@ COMMENT_PREFIX = settings.COMMENT_PREFIX
|
|||||||
COMMENT_PREFIX_SOURCE = settings.COMMENT_PREFIX_SOURCE
|
COMMENT_PREFIX_SOURCE = settings.COMMENT_PREFIX_SOURCE
|
||||||
CONTEXT_PREFIX = settings.CONTEXT_PREFIX
|
CONTEXT_PREFIX = settings.CONTEXT_PREFIX
|
||||||
FILE_NAME_MESSAGES = settings.FILE_NAME_MESSAGES
|
FILE_NAME_MESSAGES = settings.FILE_NAME_MESSAGES
|
||||||
#FILE_NAME_POTFILES = settings.FILE_NAME_POTFILES
|
|
||||||
FILE_NAME_POT = settings.FILE_NAME_POT
|
FILE_NAME_POT = settings.FILE_NAME_POT
|
||||||
SOURCE_DIR = settings.SOURCE_DIR
|
SOURCE_DIR = settings.SOURCE_DIR
|
||||||
POTFILES_DIR = settings.POTFILES_SOURCE_DIR
|
POTFILES_DIR = settings.POTFILES_SOURCE_DIR
|
||||||
SRC_POTFILES = settings.FILE_NAME_SRC_POTFILES
|
SRC_POTFILES = settings.FILE_NAME_SRC_POTFILES
|
||||||
|
|
||||||
#GETTEXT_XGETTEXT_EXECUTABLE = settings.GETTEXT_XGETTEXT_EXECUTABLE
|
|
||||||
#GETTEXT_KEYWORDS = settings.GETTEXT_KEYWORDS
|
|
||||||
CONTEXT_DEFAULT = settings.CONTEXT_DEFAULT
|
CONTEXT_DEFAULT = settings.CONTEXT_DEFAULT
|
||||||
PYGETTEXT_ALLOWED_EXTS = settings.PYGETTEXT_ALLOWED_EXTS
|
PYGETTEXT_ALLOWED_EXTS = settings.PYGETTEXT_ALLOWED_EXTS
|
||||||
|
|
||||||
@ -59,16 +55,6 @@ NC_ALLOWED = settings.WARN_MSGID_NOT_CAPITALIZED_ALLOWED
|
|||||||
SPELL_CACHE = settings.SPELL_CACHE
|
SPELL_CACHE = settings.SPELL_CACHE
|
||||||
|
|
||||||
|
|
||||||
#def generate_valid_potfiles(final_potfiles):
|
|
||||||
# "Generates a temp potfiles.in with aboslute paths."
|
|
||||||
# with open(FILE_NAME_POTFILES, 'r', 'utf-8') as f, \
|
|
||||||
# open(final_potfiles, 'w', 'utf-8') as w:
|
|
||||||
# for line in f:
|
|
||||||
# line = utils.stripeol(line)
|
|
||||||
# if line:
|
|
||||||
# w.write("".join((os.path.join(SOURCE_DIR,
|
|
||||||
# os.path.normpath(line)), "\n")))
|
|
||||||
|
|
||||||
# Do this only once!
|
# Do this only once!
|
||||||
# Get contexts defined in blf.
|
# Get contexts defined in blf.
|
||||||
CONTEXTS = {}
|
CONTEXTS = {}
|
||||||
@ -79,7 +65,7 @@ with open(os.path.join(SOURCE_DIR, settings.PYGETTEXT_CONTEXTS_DEFSRC)) as f:
|
|||||||
# (key=C_macro_name, value=C_string).
|
# (key=C_macro_name, value=C_string).
|
||||||
CONTEXTS = dict(m.groups() for m in reg.finditer(f))
|
CONTEXTS = dict(m.groups() for m in reg.finditer(f))
|
||||||
|
|
||||||
# Build regexes to extract messages (with optinal contexts) from C source.
|
# Build regexes to extract messages (with optional contexts) from C source.
|
||||||
pygettexts = tuple(re.compile(r).search
|
pygettexts = tuple(re.compile(r).search
|
||||||
for r in settings.PYGETTEXT_KEYWORDS)
|
for r in settings.PYGETTEXT_KEYWORDS)
|
||||||
_clean_str = re.compile(settings.str_clean_re).finditer
|
_clean_str = re.compile(settings.str_clean_re).finditer
|
||||||
@ -203,6 +189,8 @@ def gen_empty_pot():
|
|||||||
return utils.gen_empty_messages(blender_rev, time_str, year_str)
|
return utils.gen_empty_messages(blender_rev, time_str, year_str)
|
||||||
|
|
||||||
|
|
||||||
|
escape_re = tuple(re.compile(r[0]) for r in settings.ESCAPE_RE)
|
||||||
|
escape = lambda s, n: escape_re[n].sub(settings.ESCAPE_RE[n][1], s)
|
||||||
def merge_messages(msgs, states, messages, do_checks, spell_cache):
|
def merge_messages(msgs, states, messages, do_checks, spell_cache):
|
||||||
num_added = num_present = 0
|
num_added = num_present = 0
|
||||||
for (context, msgid), srcs in messages.items():
|
for (context, msgid), srcs in messages.items():
|
||||||
@ -214,9 +202,8 @@ def merge_messages(msgs, states, messages, do_checks, spell_cache):
|
|||||||
print("\tFrom:\n\t\t" + "\n\t\t".join(srcs))
|
print("\tFrom:\n\t\t" + "\n\t\t".join(srcs))
|
||||||
|
|
||||||
# Escape some chars in msgid!
|
# Escape some chars in msgid!
|
||||||
msgid = msgid.replace("\\", "\\\\")
|
for n in range(len(escape_re)):
|
||||||
msgid = msgid.replace("\"", "\\\"")
|
msgid = escape(msgid, n)
|
||||||
msgid = msgid.replace("\t", "\\t")
|
|
||||||
|
|
||||||
srcs = [COMMENT_PREFIX_SOURCE + s for s in srcs]
|
srcs = [COMMENT_PREFIX_SOURCE + s for s in srcs]
|
||||||
|
|
||||||
|
@ -23,9 +23,8 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import collections
|
import collections
|
||||||
from codecs import open
|
|
||||||
|
|
||||||
import settings
|
from bl_i18n_utils import settings
|
||||||
|
|
||||||
|
|
||||||
COMMENT_PREFIX = settings.COMMENT_PREFIX
|
COMMENT_PREFIX = settings.COMMENT_PREFIX
|
||||||
@ -145,7 +144,7 @@ def parse_messages(fname):
|
|||||||
clean_vars()
|
clean_vars()
|
||||||
|
|
||||||
|
|
||||||
with open(fname, 'r', "utf-8") as f:
|
with open(fname, 'r', encoding="utf-8") as f:
|
||||||
for line_nr, line in enumerate(f):
|
for line_nr, line in enumerate(f):
|
||||||
line = stripeol(line)
|
line = stripeol(line)
|
||||||
if line == "":
|
if line == "":
|
||||||
@ -248,7 +247,7 @@ def write_messages(fname, messages, commented, fuzzy):
|
|||||||
"returned values). commented and fuzzy are two sets containing msgid. " \
|
"returned values). commented and fuzzy are two sets containing msgid. " \
|
||||||
"Returns the number of written messages."
|
"Returns the number of written messages."
|
||||||
num = 0
|
num = 0
|
||||||
with open(fname, 'w', "utf-8") as f:
|
with open(fname, 'w', encoding="utf-8") as f:
|
||||||
for msgkey, val in messages.items():
|
for msgkey, val in messages.items():
|
||||||
msgctxt, msgid = msgkey
|
msgctxt, msgid = msgkey
|
||||||
f.write("\n".join(val["comment_lines"]))
|
f.write("\n".join(val["comment_lines"]))
|
||||||
|
@ -46,7 +46,7 @@ class MESH_OT_delete_edgeloop(Operator):
|
|||||||
|
|
||||||
rna_path_prop = StringProperty(
|
rna_path_prop = StringProperty(
|
||||||
name="Context Attributes",
|
name="Context Attributes",
|
||||||
description="rna context string",
|
description="RNA context string",
|
||||||
maxlen=1024,
|
maxlen=1024,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -372,8 +372,8 @@ class WM_OT_context_toggle_enum(Operator):
|
|||||||
|
|
||||||
|
|
||||||
class WM_OT_context_cycle_int(Operator):
|
class WM_OT_context_cycle_int(Operator):
|
||||||
"""Set a context value. Useful for cycling active material, """ \
|
"""Set a context value (useful for cycling active material, """ \
|
||||||
"""vertex keys, groups' etc"""
|
"""vertex keys, groups, etc.)"""
|
||||||
bl_idname = "wm.context_cycle_int"
|
bl_idname = "wm.context_cycle_int"
|
||||||
bl_label = "Context Int Cycle"
|
bl_label = "Context Int Cycle"
|
||||||
bl_options = {'UNDO', 'INTERNAL'}
|
bl_options = {'UNDO', 'INTERNAL'}
|
||||||
|
@ -870,7 +870,7 @@ AviError AVI_open_compress(char *name, AviMovie *movie, int streams, ...)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (movie->streams[i].sh.Type == FCC("auds")) {
|
else if (movie->streams[i].sh.Type == FCC("auds")) {
|
||||||
// pass
|
/* pass */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -60,15 +60,30 @@ typedef union IDPropertyTemplate {
|
|||||||
|
|
||||||
/* note: as a start to move away from the stupid IDP_New function, this type
|
/* note: as a start to move away from the stupid IDP_New function, this type
|
||||||
* has it's own allocation function.*/
|
* has it's own allocation function.*/
|
||||||
IDProperty *IDP_NewIDPArray(const char *name);
|
IDProperty *IDP_NewIDPArray(const char *name)
|
||||||
IDProperty *IDP_CopyIDPArray(IDProperty *array);
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
IDProperty *IDP_CopyIDPArray(IDProperty *array)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
void IDP_FreeIDPArray(IDProperty *prop);
|
void IDP_FreeIDPArray(IDProperty *prop);
|
||||||
|
|
||||||
/* shallow copies item */
|
/* shallow copies item */
|
||||||
void IDP_SetIndexArray(struct IDProperty *prop, int index, struct IDProperty *item);
|
void IDP_SetIndexArray(struct IDProperty *prop, int index, struct IDProperty *item);
|
||||||
struct IDProperty *IDP_GetIndexArray(struct IDProperty *prop, int index);
|
struct IDProperty *IDP_GetIndexArray(struct IDProperty *prop, int index)
|
||||||
struct IDProperty *IDP_AppendArray(struct IDProperty *prop, struct IDProperty *item);
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void IDP_AppendArray(struct IDProperty *prop, struct IDProperty *item);
|
||||||
void IDP_ResizeIDPArray(struct IDProperty *prop, int len);
|
void IDP_ResizeIDPArray(struct IDProperty *prop, int len);
|
||||||
|
|
||||||
/* ----------- Numeric Array Type ----------- */
|
/* ----------- Numeric Array Type ----------- */
|
||||||
@ -77,11 +92,33 @@ void IDP_ResizeArray(struct IDProperty *prop, int newlen);
|
|||||||
void IDP_FreeArray(struct IDProperty *prop);
|
void IDP_FreeArray(struct IDProperty *prop);
|
||||||
|
|
||||||
/* ---------- String Type ------------ */
|
/* ---------- String Type ------------ */
|
||||||
IDProperty *IDP_NewString(const char *st, const char *name, int maxlen); /* maxlen excludes '\0' */
|
IDProperty *IDP_NewString(const char *st, const char *name, int maxlen) /* maxlen excludes '\0' */
|
||||||
void IDP_AssignString(struct IDProperty *prop, const char *st, int maxlen); /* maxlen excludes '\0' */
|
#ifdef __GNUC__
|
||||||
void IDP_ConcatStringC(struct IDProperty *prop, const char *st);
|
__attribute__((warn_unused_result))
|
||||||
void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append);
|
__attribute__((nonnull))
|
||||||
void IDP_FreeString(struct IDProperty *prop);
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
void IDP_AssignString(struct IDProperty *prop, const char *st, int maxlen) /* maxlen excludes '\0' */
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void IDP_ConcatStringC(struct IDProperty *prop, const char *st)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void IDP_FreeString(struct IDProperty *prop)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/*-------- ID Type -------*/
|
/*-------- ID Type -------*/
|
||||||
void IDP_LinkID(struct IDProperty *prop, ID *id);
|
void IDP_LinkID(struct IDProperty *prop, ID *id);
|
||||||
@ -90,17 +127,29 @@ void IDP_UnlinkID(struct IDProperty *prop);
|
|||||||
/*-------- Group Functions -------*/
|
/*-------- Group Functions -------*/
|
||||||
|
|
||||||
/** Sync values from one group to another, only where they match */
|
/** Sync values from one group to another, only where they match */
|
||||||
void IDP_SyncGroupValues(struct IDProperty *dest, struct IDProperty *src);
|
void IDP_SyncGroupValues(struct IDProperty *dest, struct IDProperty *src)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* replaces all properties with the same name in a destination group from a source group.
|
* replaces all properties with the same name in a destination group from a source group.
|
||||||
*/
|
*/
|
||||||
void IDP_ReplaceGroupInGroup(struct IDProperty *dest, struct IDProperty *src);
|
void IDP_ReplaceGroupInGroup(struct IDProperty *dest, struct IDProperty *src)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a property with the same name as prop exists, and if so replaces it.
|
* Checks if a property with the same name as prop exists, and if so replaces it.
|
||||||
* Use this to preserve order!*/
|
* Use this to preserve order!*/
|
||||||
void IDP_ReplaceInGroup(struct IDProperty *group, struct IDProperty *prop);
|
void IDP_ReplaceInGroup(struct IDProperty *group, struct IDProperty *prop)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function has a sanity check to make sure ID properties with the same name don't
|
* This function has a sanity check to make sure ID properties with the same name don't
|
||||||
@ -117,12 +166,20 @@ void IDP_ReplaceInGroup(struct IDProperty *group, struct IDProperty *prop);
|
|||||||
* struct. In the future this will just be IDP_FreeProperty and the code will
|
* struct. In the future this will just be IDP_FreeProperty and the code will
|
||||||
* be reorganized to work properly.
|
* be reorganized to work properly.
|
||||||
*/
|
*/
|
||||||
int IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop);
|
int IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/** this is the same as IDP_AddToGroup, only you pass an item
|
/** this is the same as IDP_AddToGroup, only you pass an item
|
||||||
* in the group list to be inserted after. */
|
* in the group list to be inserted after. */
|
||||||
int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
|
int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
|
||||||
struct IDProperty *pnew);
|
struct IDProperty *pnew)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/** \note this does not free the property!!
|
/** \note this does not free the property!!
|
||||||
*
|
*
|
||||||
@ -130,18 +187,36 @@ int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
|
|||||||
* IDP_FreeProperty(prop); //free all subdata
|
* IDP_FreeProperty(prop); //free all subdata
|
||||||
* MEM_freeN(prop); //free property struct itself
|
* MEM_freeN(prop); //free property struct itself
|
||||||
*/
|
*/
|
||||||
void IDP_RemFromGroup(struct IDProperty *group, struct IDProperty *prop);
|
void IDP_RemFromGroup(struct IDProperty *group, struct IDProperty *prop)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
IDProperty *IDP_GetPropertyFromGroup(struct IDProperty *prop, const char *name);
|
IDProperty *IDP_GetPropertyFromGroup(struct IDProperty *prop, const char *name)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
/** same as above but ensure type match */
|
/** same as above but ensure type match */
|
||||||
IDProperty *IDP_GetPropertyTypeFromGroup(struct IDProperty *prop, const char *name, const char type);
|
IDProperty *IDP_GetPropertyTypeFromGroup(struct IDProperty *prop, const char *name, const char type)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get an iterator to iterate over the members of an id property group.
|
* Get an iterator to iterate over the members of an id property group.
|
||||||
* Note that this will automatically free the iterator once iteration is complete;
|
* Note that this will automatically free the iterator once iteration is complete;
|
||||||
* if you stop the iteration before hitting the end, make sure to call
|
* if you stop the iteration before hitting the end, make sure to call
|
||||||
* IDP_FreeIterBeforeEnd(). */
|
* IDP_FreeIterBeforeEnd(). */
|
||||||
void *IDP_GetGroupIterator(struct IDProperty *prop);
|
void *IDP_GetGroupIterator(struct IDProperty *prop)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the next item in the iteration. To use, simple for a loop like the following:
|
* Returns the next item in the iteration. To use, simple for a loop like the following:
|
||||||
@ -149,21 +224,45 @@ void *IDP_GetGroupIterator(struct IDProperty *prop);
|
|||||||
* ...
|
* ...
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
IDProperty *IDP_GroupIterNext(void *vself);
|
IDProperty *IDP_GroupIterNext(void *vself)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the iterator pointed to at vself, only use this if iteration is stopped early;
|
* Frees the iterator pointed to at vself, only use this if iteration is stopped early;
|
||||||
* when the iterator hits the end of the list it'll automatically free itself.*/
|
* when the iterator hits the end of the list it'll automatically free itself.*/
|
||||||
void IDP_FreeIterBeforeEnd(void *vself);
|
void IDP_FreeIterBeforeEnd(void *vself)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/*-------- Main Functions --------*/
|
/*-------- Main Functions --------*/
|
||||||
/** Get the Group property that contains the id properties for ID id. Set create_if_needed
|
/** Get the Group property that contains the id properties for ID id. Set create_if_needed
|
||||||
* to create the Group property and attach it to id if it doesn't exist; otherwise
|
* to create the Group property and attach it to id if it doesn't exist; otherwise
|
||||||
* the function will return NULL if there's no Group property attached to the ID.*/
|
* the function will return NULL if there's no Group property attached to the ID.*/
|
||||||
struct IDProperty *IDP_GetProperties(struct ID *id, int create_if_needed);
|
struct IDProperty *IDP_GetProperties(struct ID *id, int create_if_needed)
|
||||||
struct IDProperty *IDP_CopyProperty(struct IDProperty *prop);
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
struct IDProperty *IDP_CopyProperty(struct IDProperty *prop)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
int IDP_EqualsProperties(struct IDProperty *prop1, struct IDProperty *prop2);
|
int IDP_EqualsProperties(struct IDProperty *prop1, struct IDProperty *prop2)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate a new ID.
|
* Allocate a new ID.
|
||||||
@ -190,7 +289,12 @@ int IDP_EqualsProperties(struct IDProperty *prop1, struct IDProperty *prop2);
|
|||||||
* IDP_AddToGroup or MEM_freeN the property, doing anything else might result in
|
* IDP_AddToGroup or MEM_freeN the property, doing anything else might result in
|
||||||
* a memory leak.
|
* a memory leak.
|
||||||
*/
|
*/
|
||||||
struct IDProperty *IDP_New(const int type, const IDPropertyTemplate *val, const char *name);
|
struct IDProperty *IDP_New(const int type, const IDPropertyTemplate *val, const char *name)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/** \note this will free all child properties of list arrays and groups!
|
/** \note this will free all child properties of list arrays and groups!
|
||||||
* Also, note that this does NOT unlink anything! Plus it doesn't free
|
* Also, note that this does NOT unlink anything! Plus it doesn't free
|
||||||
|
@ -38,9 +38,9 @@ extern "C" {
|
|||||||
|
|
||||||
struct Lamp;
|
struct Lamp;
|
||||||
|
|
||||||
void *BKE_lamp_add(const char *name);
|
struct Lamp *BKE_lamp_add(const char *name) WARN_UNUSED;
|
||||||
struct Lamp *BKE_lamp_copy(struct Lamp *la);
|
struct Lamp *BKE_lamp_copy(struct Lamp *la) WARN_UNUSED;
|
||||||
struct Lamp *localize_lamp(struct Lamp *la);
|
struct Lamp *localize_lamp(struct Lamp *la) WARN_UNUSED;
|
||||||
void BKE_lamp_make_local(struct Lamp *la);
|
void BKE_lamp_make_local(struct Lamp *la);
|
||||||
void BKE_lamp_free(struct Lamp *la);
|
void BKE_lamp_free(struct Lamp *la);
|
||||||
|
|
||||||
|
@ -45,8 +45,18 @@ struct bContext;
|
|||||||
struct PointerRNA;
|
struct PointerRNA;
|
||||||
struct PropertyRNA;
|
struct PropertyRNA;
|
||||||
|
|
||||||
void *BKE_libblock_alloc(struct ListBase *lb, short type, const char *name);
|
void *BKE_libblock_alloc(struct ListBase *lb, short type, const char *name)
|
||||||
void *BKE_libblock_copy(struct ID *id);
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void *BKE_libblock_copy(struct ID *id)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const short do_action);
|
void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const short do_action);
|
||||||
|
|
||||||
void BKE_id_lib_local_paths(struct Main *bmain, struct Library *lib, struct ID *id);
|
void BKE_id_lib_local_paths(struct Main *bmain, struct Library *lib, struct ID *id);
|
||||||
@ -82,7 +92,12 @@ void name_uiprefix_id(char *name, struct ID *id);
|
|||||||
void test_idbutton(char *name);
|
void test_idbutton(char *name);
|
||||||
void text_idbutton(struct ID *id, char *text);
|
void text_idbutton(struct ID *id, char *text);
|
||||||
void BKE_library_make_local(struct Main *bmain, struct Library *lib, int untagged_only);
|
void BKE_library_make_local(struct Main *bmain, struct Library *lib, int untagged_only);
|
||||||
struct ID *BKE_libblock_find_name(const short type, const char *name);
|
struct ID *BKE_libblock_find_name(const short type, const char *name)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
void clear_id_newpoins(void);
|
void clear_id_newpoins(void);
|
||||||
|
|
||||||
void IDnames_to_pupstring(const char **str, const char *title, const char *extraops,
|
void IDnames_to_pupstring(const char **str, const char *title, const char *extraops,
|
||||||
|
@ -2210,7 +2210,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss)
|
|||||||
VertDataAdd(co, r, ss);
|
VertDataAdd(co, r, ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
// edge flags cleared later
|
/* edge flags cleared later */
|
||||||
}
|
}
|
||||||
for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) {
|
for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) {
|
||||||
CCGVert *v = effectedV[ptrIdx];
|
CCGVert *v = effectedV[ptrIdx];
|
||||||
@ -2337,7 +2337,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss)
|
|||||||
VertDataAdd(nCo, r, ss);
|
VertDataAdd(nCo, r, ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
// vert flags cleared later
|
/* vert flags cleared later */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ss->useAgeCounts) {
|
if (ss->useAgeCounts) {
|
||||||
|
@ -74,7 +74,7 @@
|
|||||||
static DerivedMesh *navmesh_dm_createNavMeshForVisualization(DerivedMesh *dm);
|
static DerivedMesh *navmesh_dm_createNavMeshForVisualization(DerivedMesh *dm);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "BLO_sys_types.h" // for intptr_t support
|
#include "BLO_sys_types.h" /* for intptr_t support */
|
||||||
|
|
||||||
#include "GL/glew.h"
|
#include "GL/glew.h"
|
||||||
|
|
||||||
@ -956,22 +956,22 @@ void weight_to_rgb(float r_rgb[3], const float weight)
|
|||||||
{
|
{
|
||||||
const float blend = ((weight / 2.0f) + 0.5f);
|
const float blend = ((weight / 2.0f) + 0.5f);
|
||||||
|
|
||||||
if (weight <= 0.25f) { // blue->cyan
|
if (weight <= 0.25f) { /* blue->cyan */
|
||||||
r_rgb[0] = 0.0f;
|
r_rgb[0] = 0.0f;
|
||||||
r_rgb[1] = blend * weight * 4.0f;
|
r_rgb[1] = blend * weight * 4.0f;
|
||||||
r_rgb[2] = blend;
|
r_rgb[2] = blend;
|
||||||
}
|
}
|
||||||
else if (weight <= 0.50f) { // cyan->green
|
else if (weight <= 0.50f) { /* cyan->green */
|
||||||
r_rgb[0] = 0.0f;
|
r_rgb[0] = 0.0f;
|
||||||
r_rgb[1] = blend;
|
r_rgb[1] = blend;
|
||||||
r_rgb[2] = blend * (1.0f - ((weight - 0.25f) * 4.0f));
|
r_rgb[2] = blend * (1.0f - ((weight - 0.25f) * 4.0f));
|
||||||
}
|
}
|
||||||
else if (weight <= 0.75f) { // green->yellow
|
else if (weight <= 0.75f) { /* green->yellow */
|
||||||
r_rgb[0] = blend * ((weight - 0.50f) * 4.0f);
|
r_rgb[0] = blend * ((weight - 0.50f) * 4.0f);
|
||||||
r_rgb[1] = blend;
|
r_rgb[1] = blend;
|
||||||
r_rgb[2] = 0.0f;
|
r_rgb[2] = 0.0f;
|
||||||
}
|
}
|
||||||
else if (weight <= 1.0f) { // yellow->red
|
else if (weight <= 1.0f) { /* yellow->red */
|
||||||
r_rgb[0] = blend;
|
r_rgb[0] = blend;
|
||||||
r_rgb[1] = blend * (1.0f - ((weight - 0.75f) * 4.0f));
|
r_rgb[1] = blend * (1.0f - ((weight - 0.75f) * 4.0f));
|
||||||
r_rgb[2] = 0.0f;
|
r_rgb[2] = 0.0f;
|
||||||
@ -2379,16 +2379,16 @@ float *mesh_get_mapped_verts_nors(Scene *scene, Object *ob)
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float *precomputedFaceNormals;
|
float *precomputedFaceNormals;
|
||||||
MTFace *mtface; // texture coordinates
|
MTFace *mtface; /* texture coordinates */
|
||||||
MFace *mface; // indices
|
MFace *mface; /* indices */
|
||||||
MVert *mvert; // vertices & normals
|
MVert *mvert; /* vertices & normals */
|
||||||
float (*orco)[3];
|
float (*orco)[3];
|
||||||
float (*tangent)[4]; // destination
|
float (*tangent)[4]; /* destination */
|
||||||
int numTessFaces;
|
int numTessFaces;
|
||||||
|
|
||||||
} SGLSLMeshToTangent;
|
} SGLSLMeshToTangent;
|
||||||
|
|
||||||
// interface
|
/* interface */
|
||||||
#include "mikktspace.h"
|
#include "mikktspace.h"
|
||||||
|
|
||||||
static int GetNumFaces(const SMikkTSpaceContext *pContext)
|
static int GetNumFaces(const SMikkTSpaceContext *pContext)
|
||||||
@ -2508,7 +2508,7 @@ void DM_add_tangent_layer(DerivedMesh *dm)
|
|||||||
BLI_memarena_use_calloc(arena);
|
BLI_memarena_use_calloc(arena);
|
||||||
vtangents = MEM_callocN(sizeof(VertexTangent *) * totvert, "VertexTangent");
|
vtangents = MEM_callocN(sizeof(VertexTangent *) * totvert, "VertexTangent");
|
||||||
|
|
||||||
// new computation method
|
/* new computation method */
|
||||||
iCalcNewMethod = 1;
|
iCalcNewMethod = 1;
|
||||||
if (iCalcNewMethod != 0) {
|
if (iCalcNewMethod != 0) {
|
||||||
SGLSLMeshToTangent mesh2tangent = {0};
|
SGLSLMeshToTangent mesh2tangent = {0};
|
||||||
@ -2532,7 +2532,7 @@ void DM_add_tangent_layer(DerivedMesh *dm)
|
|||||||
sInterface.m_getNormal = GetNormal;
|
sInterface.m_getNormal = GetNormal;
|
||||||
sInterface.m_setTSpaceBasic = SetTSpace;
|
sInterface.m_setTSpaceBasic = SetTSpace;
|
||||||
|
|
||||||
// 0 if failed
|
/* 0 if failed */
|
||||||
iCalcNewMethod = genTangSpaceDefault(&sContext);
|
iCalcNewMethod = genTangSpaceDefault(&sContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2638,7 +2638,7 @@ void DM_calc_auto_bump_scale(DerivedMesh *dm)
|
|||||||
tex_coords[3] = mtface[f].uv[3];
|
tex_coords[3] = mtface[f].uv[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
// discard degenerate faces
|
/* discard degenerate faces */
|
||||||
is_degenerate = 0;
|
is_degenerate = 0;
|
||||||
if (equals_v3v3(verts[0], verts[1]) || equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) ||
|
if (equals_v3v3(verts[0], verts[1]) || equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) ||
|
||||||
equals_v2v2(tex_coords[0], tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || equals_v2v2(tex_coords[1], tex_coords[2]))
|
equals_v2v2(tex_coords[0], tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || equals_v2v2(tex_coords[1], tex_coords[2]))
|
||||||
@ -2646,7 +2646,7 @@ void DM_calc_auto_bump_scale(DerivedMesh *dm)
|
|||||||
is_degenerate = 1;
|
is_degenerate = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify last vertex as well if this is a quad
|
/* verify last vertex as well if this is a quad */
|
||||||
if (is_degenerate == 0 && nr_verts == 4) {
|
if (is_degenerate == 0 && nr_verts == 4) {
|
||||||
if (equals_v3v3(verts[3], verts[0]) || equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) ||
|
if (equals_v3v3(verts[3], verts[0]) || equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) ||
|
||||||
equals_v2v2(tex_coords[3], tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || equals_v2v2(tex_coords[3], tex_coords[2]))
|
equals_v2v2(tex_coords[3], tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || equals_v2v2(tex_coords[3], tex_coords[2]))
|
||||||
@ -2654,7 +2654,7 @@ void DM_calc_auto_bump_scale(DerivedMesh *dm)
|
|||||||
is_degenerate = 1;
|
is_degenerate = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify the winding is consistent
|
/* verify the winding is consistent */
|
||||||
if (is_degenerate == 0) {
|
if (is_degenerate == 0) {
|
||||||
float prev_edge[2];
|
float prev_edge[2];
|
||||||
int is_signed = 0;
|
int is_signed = 0;
|
||||||
@ -2681,11 +2681,11 @@ void DM_calc_auto_bump_scale(DerivedMesh *dm)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// proceed if not a degenerate face
|
/* proceed if not a degenerate face */
|
||||||
if (is_degenerate == 0) {
|
if (is_degenerate == 0) {
|
||||||
int nr_tris_to_pile = 0;
|
int nr_tris_to_pile = 0;
|
||||||
// quads split at shortest diagonal
|
/* quads split at shortest diagonal */
|
||||||
int offs = 0; // initial triangulation is 0,1,2 and 0, 2, 3
|
int offs = 0; /* initial triangulation is 0,1,2 and 0, 2, 3 */
|
||||||
if (nr_verts == 4) {
|
if (nr_verts == 4) {
|
||||||
float pos_len_diag0, pos_len_diag1;
|
float pos_len_diag0, pos_len_diag1;
|
||||||
float vtmp[3];
|
float vtmp[3];
|
||||||
@ -2743,7 +2743,7 @@ void DM_calc_auto_bump_scale(DerivedMesh *dm)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// finalize
|
/* finalize */
|
||||||
{
|
{
|
||||||
const float avg_area_ratio = (nr_accumulated > 0) ? ((float)(dsum / nr_accumulated)) : 1.0f;
|
const float avg_area_ratio = (nr_accumulated > 0) ? ((float)(dsum / nr_accumulated)) : 1.0f;
|
||||||
const float use_as_render_bump_scale = sqrtf(avg_area_ratio); // use width of average surface ratio as your bump scale
|
const float use_as_render_bump_scale = sqrtf(avg_area_ratio); // use width of average surface ratio as your bump scale
|
||||||
|
@ -134,7 +134,7 @@ void BKE_action_make_local(bAction *act)
|
|||||||
if (act->id.lib == NULL)
|
if (act->id.lib == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// XXX: double-check this; it used to be just single-user check, but that was when fake-users were still default
|
/* XXX: double-check this; it used to be just single-user check, but that was when fake-users were still default */
|
||||||
if ((act->id.flag & LIB_FAKEUSER) && (act->id.us <= 1)) {
|
if ((act->id.flag & LIB_FAKEUSER) && (act->id.us <= 1)) {
|
||||||
id_clear_lib_data(bmain, &act->id);
|
id_clear_lib_data(bmain, &act->id);
|
||||||
return;
|
return;
|
||||||
@ -547,7 +547,7 @@ void BKE_pose_copy_data(bPose **dst, bPose *src, int copycon)
|
|||||||
outPose->ikparam = MEM_dupallocN(src->ikparam);
|
outPose->ikparam = MEM_dupallocN(src->ikparam);
|
||||||
|
|
||||||
for (pchan = outPose->chanbase.first; pchan; pchan = pchan->next) {
|
for (pchan = outPose->chanbase.first; pchan; pchan = pchan->next) {
|
||||||
// TODO: rename this argument...
|
/* TODO: rename this argument... */
|
||||||
if (copycon) {
|
if (copycon) {
|
||||||
copy_constraints(&listb, &pchan->constraints, TRUE); // copy_constraints NULLs listb
|
copy_constraints(&listb, &pchan->constraints, TRUE); // copy_constraints NULLs listb
|
||||||
pchan->constraints = listb;
|
pchan->constraints = listb;
|
||||||
@ -807,7 +807,7 @@ void framechange_poses_clear_unkeyed(void)
|
|||||||
bPoseChannel *pchan;
|
bPoseChannel *pchan;
|
||||||
|
|
||||||
/* This needs to be done for each object that has a pose */
|
/* This needs to be done for each object that has a pose */
|
||||||
// TODO: proxies may/may not be correctly handled here... (this needs checking)
|
/* TODO: proxies may/may not be correctly handled here... (this needs checking) */
|
||||||
for (ob = G.main->object.first; ob; ob = ob->id.next) {
|
for (ob = G.main->object.first; ob; ob = ob->id.next) {
|
||||||
/* we only need to do this on objects with a pose */
|
/* we only need to do this on objects with a pose */
|
||||||
if ( (pose = ob->pose) ) {
|
if ( (pose = ob->pose) ) {
|
||||||
@ -907,7 +907,7 @@ void calc_action_range(const bAction *act, float *start, float *end, short incl_
|
|||||||
float nmin, nmax;
|
float nmin, nmax;
|
||||||
|
|
||||||
/* get extents for this curve */
|
/* get extents for this curve */
|
||||||
// TODO: allow enabling/disabling this?
|
/* TODO: allow enabling/disabling this? */
|
||||||
calc_fcurve_range(fcu, &nmin, &nmax, FALSE, TRUE);
|
calc_fcurve_range(fcu, &nmin, &nmax, FALSE, TRUE);
|
||||||
|
|
||||||
/* compare to the running tally */
|
/* compare to the running tally */
|
||||||
@ -949,7 +949,7 @@ void calc_action_range(const bAction *act, float *start, float *end, short incl_
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// TODO: function modifier may need some special limits
|
/* TODO: function modifier may need some special limits */
|
||||||
|
|
||||||
default: /* all other standard modifiers are on the infinite range... */
|
default: /* all other standard modifiers are on the infinite range... */
|
||||||
min = MINAFRAMEF;
|
min = MINAFRAMEF;
|
||||||
@ -1129,7 +1129,7 @@ void BKE_pose_copy_result(bPose *to, bPose *from)
|
|||||||
bPoseChannel *pchanto, *pchanfrom;
|
bPoseChannel *pchanto, *pchanfrom;
|
||||||
|
|
||||||
if (to == NULL || from == NULL) {
|
if (to == NULL || from == NULL) {
|
||||||
printf("pose result copy error to:%p from:%p\n", (void *)to, (void *)from); // debug temp
|
printf("pose result copy error to:%p from:%p\n", (void *)to, (void *)from); /* debug temp */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1378,12 +1378,12 @@ static float stridechannel_frame(Object *ob, float sizecorr, bActionStrip *strip
|
|||||||
/* now we need to go pdist further (or less) on cu path */
|
/* now we need to go pdist further (or less) on cu path */
|
||||||
where_on_path(ob, (pathdist) / path->totdist, vec1, dir); /* vec needs size 4 */
|
where_on_path(ob, (pathdist) / path->totdist, vec1, dir); /* vec needs size 4 */
|
||||||
if (pdistNewNormalized <= 1) {
|
if (pdistNewNormalized <= 1) {
|
||||||
// search for correction in positive path-direction
|
/* search for correction in positive path-direction */
|
||||||
where_on_path(ob, pdistNewNormalized, vec2, dir); /* vec needs size 4 */
|
where_on_path(ob, pdistNewNormalized, vec2, dir); /* vec needs size 4 */
|
||||||
sub_v3_v3v3(stride_offset, vec2, vec1);
|
sub_v3_v3v3(stride_offset, vec2, vec1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// we reached the end of the path, search backwards instead
|
/* we reached the end of the path, search backwards instead */
|
||||||
where_on_path(ob, (pathdist - pdist) / path->totdist, vec2, dir); /* vec needs size 4 */
|
where_on_path(ob, (pathdist - pdist) / path->totdist, vec2, dir); /* vec needs size 4 */
|
||||||
sub_v3_v3v3(stride_offset, vec1, vec2);
|
sub_v3_v3v3(stride_offset, vec1, vec2);
|
||||||
}
|
}
|
||||||
|
@ -90,8 +90,8 @@ void animviz_settings_init(bAnimVizSettings *avs)
|
|||||||
/* ghosting settings */
|
/* ghosting settings */
|
||||||
avs->ghost_bc = avs->ghost_ac = 10;
|
avs->ghost_bc = avs->ghost_ac = 10;
|
||||||
|
|
||||||
avs->ghost_sf = 1; // xxx - take from scene instead?
|
avs->ghost_sf = 1; /* xxx - take from scene instead? */
|
||||||
avs->ghost_ef = 250; // xxx - take from scene instead?
|
avs->ghost_ef = 250; /* xxx - take from scene instead? */
|
||||||
|
|
||||||
avs->ghost_step = 1;
|
avs->ghost_step = 1;
|
||||||
|
|
||||||
@ -99,8 +99,8 @@ void animviz_settings_init(bAnimVizSettings *avs)
|
|||||||
/* path settings */
|
/* path settings */
|
||||||
avs->path_bc = avs->path_ac = 10;
|
avs->path_bc = avs->path_ac = 10;
|
||||||
|
|
||||||
avs->path_sf = 1; // xxx - take from scene instead?
|
avs->path_sf = 1; /* xxx - take from scene instead? */
|
||||||
avs->path_ef = 250; // xxx - take from scene instead?
|
avs->path_ef = 250; /* xxx - take from scene instead? */
|
||||||
|
|
||||||
avs->path_viewflag = (MOTIONPATH_VIEW_KFRAS | MOTIONPATH_VIEW_KFNOS);
|
avs->path_viewflag = (MOTIONPATH_VIEW_KFRAS | MOTIONPATH_VIEW_KFNOS);
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ typedef struct MPathTarget {
|
|||||||
/* get list of motion paths to be baked for the given object
|
/* get list of motion paths to be baked for the given object
|
||||||
* - assumes the given list is ready to be used
|
* - assumes the given list is ready to be used
|
||||||
*/
|
*/
|
||||||
// TODO: it would be nice in future to be able to update objects dependent on these bones too?
|
/* TODO: it would be nice in future to be able to update objects dependent on these bones too? */
|
||||||
void animviz_get_object_motionpaths(Object *ob, ListBase *targets)
|
void animviz_get_object_motionpaths(Object *ob, ListBase *targets)
|
||||||
{
|
{
|
||||||
MPathTarget *mpt;
|
MPathTarget *mpt;
|
||||||
@ -309,7 +309,9 @@ static void motionpaths_calc_optimise_depsgraph(Scene *scene, ListBase *targets)
|
|||||||
BLI_addhead(&scene->base, base);
|
BLI_addhead(&scene->base, base);
|
||||||
|
|
||||||
mpt->ob->flag |= BA_TEMP_TAG;
|
mpt->ob->flag |= BA_TEMP_TAG;
|
||||||
break; // we really don't need to continue anymore once this happens, but this line might really 'break'
|
|
||||||
|
/* we really don't need to continue anymore once this happens, but this line might really 'break' */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -330,15 +332,15 @@ static void motionpaths_calc_update_scene(Scene *scene)
|
|||||||
/* find the last object with the tag
|
/* find the last object with the tag
|
||||||
* - all those afterwards are assumed to not be relevant for our calculations
|
* - all those afterwards are assumed to not be relevant for our calculations
|
||||||
*/
|
*/
|
||||||
// optimize further by moving out...
|
/* optimize further by moving out... */
|
||||||
for (base = scene->base.first; base; base = base->next) {
|
for (base = scene->base.first; base; base = base->next) {
|
||||||
if (base->object->flag & BA_TEMP_TAG)
|
if (base->object->flag & BA_TEMP_TAG)
|
||||||
last = base;
|
last = base;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* perform updates for tagged objects */
|
/* perform updates for tagged objects */
|
||||||
// XXX: this will break if rigs depend on scene or other data that
|
/* XXX: this will break if rigs depend on scene or other data that
|
||||||
// is animated but not attached to/updatable from objects
|
* is animated but not attached to/updatable from objects */
|
||||||
for (base = scene->base.first; base; base = base->next) {
|
for (base = scene->base.first; base; base = base->next) {
|
||||||
/* update this object */
|
/* update this object */
|
||||||
BKE_object_handle_update(scene, base->object);
|
BKE_object_handle_update(scene, base->object);
|
||||||
@ -353,7 +355,7 @@ static void motionpaths_calc_update_scene(Scene *scene)
|
|||||||
* that doesn't force complete update, but for now, this is the
|
* that doesn't force complete update, but for now, this is the
|
||||||
* most accurate way!
|
* most accurate way!
|
||||||
*/
|
*/
|
||||||
BKE_scene_update_for_newframe(G.main, scene, scene->lay); // XXX this is the best way we can get anything moving
|
BKE_scene_update_for_newframe(G.main, scene, scene->lay); /* XXX this is the best way we can get anything moving */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +405,7 @@ static void motionpaths_calc_bake_targets(Scene *scene, ListBase *targets)
|
|||||||
* - ob: object whose flagged motionpaths should get calculated
|
* - ob: object whose flagged motionpaths should get calculated
|
||||||
* - recalc: whether we need to
|
* - recalc: whether we need to
|
||||||
*/
|
*/
|
||||||
// TODO: include reports pointer?
|
/* TODO: include reports pointer? */
|
||||||
void animviz_calc_motionpaths(Scene *scene, ListBase *targets)
|
void animviz_calc_motionpaths(Scene *scene, ListBase *targets)
|
||||||
{
|
{
|
||||||
MPathTarget *mpt;
|
MPathTarget *mpt;
|
||||||
@ -418,9 +420,9 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets)
|
|||||||
cfra = CFRA;
|
cfra = CFRA;
|
||||||
sfra = efra = cfra;
|
sfra = efra = cfra;
|
||||||
|
|
||||||
// TODO: this method could be improved...
|
/* TODO: this method could be improved...
|
||||||
// 1) max range for standard baking
|
* 1) max range for standard baking
|
||||||
// 2) minimum range for recalc baking (i.e. between keyframes, but how?)
|
* 2) minimum range for recalc baking (i.e. between keyframes, but how?) */
|
||||||
for (mpt = targets->first; mpt; mpt = mpt->next) {
|
for (mpt = targets->first; mpt; mpt = mpt->next) {
|
||||||
/* try to increase area to do (only as much as needed) */
|
/* try to increase area to do (only as much as needed) */
|
||||||
sfra = MIN2(sfra, mpt->mpath->start_frame);
|
sfra = MIN2(sfra, mpt->mpath->start_frame);
|
||||||
@ -429,7 +431,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets)
|
|||||||
if (efra <= sfra) return;
|
if (efra <= sfra) return;
|
||||||
|
|
||||||
/* optimize the depsgraph for faster updates */
|
/* optimize the depsgraph for faster updates */
|
||||||
// TODO: whether this is used should depend on some setting for the level of optimisations used
|
/* TODO: whether this is used should depend on some setting for the level of optimisations used */
|
||||||
motionpaths_calc_optimise_depsgraph(scene, targets);
|
motionpaths_calc_optimise_depsgraph(scene, targets);
|
||||||
|
|
||||||
/* calculate path over requested range */
|
/* calculate path over requested range */
|
||||||
|
@ -78,7 +78,7 @@ short id_type_can_have_animdata(ID *id)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Only some ID-blocks have this info for now */
|
/* Only some ID-blocks have this info for now */
|
||||||
// TODO: finish adding this for the other blocktypes
|
/* TODO: finish adding this for the other blocktypes */
|
||||||
switch (GS(id->name)) {
|
switch (GS(id->name)) {
|
||||||
/* has AnimData */
|
/* has AnimData */
|
||||||
case ID_OB:
|
case ID_OB:
|
||||||
@ -231,7 +231,7 @@ void BKE_free_animdata(ID *id)
|
|||||||
free_fcurves(&adt->drivers);
|
free_fcurves(&adt->drivers);
|
||||||
|
|
||||||
/* free overrides */
|
/* free overrides */
|
||||||
// TODO...
|
/* TODO... */
|
||||||
|
|
||||||
/* free animdata now */
|
/* free animdata now */
|
||||||
MEM_freeN(adt);
|
MEM_freeN(adt);
|
||||||
@ -334,7 +334,7 @@ void BKE_animdata_make_local(AnimData *adt)
|
|||||||
if (adt->remap && adt->remap->target) BKE_action_make_local(adt->remap->target);
|
if (adt->remap && adt->remap->target) BKE_action_make_local(adt->remap->target);
|
||||||
|
|
||||||
/* Drivers */
|
/* Drivers */
|
||||||
// TODO: need to remap the ID-targets too?
|
/* TODO: need to remap the ID-targets too? */
|
||||||
|
|
||||||
/* NLA Data */
|
/* NLA Data */
|
||||||
for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next)
|
for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next)
|
||||||
@ -506,7 +506,7 @@ void BKE_animdata_separate_by_basepath(ID *srcID, ID *dstID, ListBase *basepaths
|
|||||||
printf("Argh! Source and Destination share animation! ('%s' and '%s' both use '%s') Making new empty action\n",
|
printf("Argh! Source and Destination share animation! ('%s' and '%s' both use '%s') Making new empty action\n",
|
||||||
srcID->name, dstID->name, srcAdt->action->id.name);
|
srcID->name, dstID->name, srcAdt->action->id.name);
|
||||||
|
|
||||||
// TODO: review this...
|
/* TODO: review this... */
|
||||||
id_us_min(&dstAdt->action->id);
|
id_us_min(&dstAdt->action->id);
|
||||||
dstAdt->action = add_empty_action(dstAdt->action->id.name + 2);
|
dstAdt->action = add_empty_action(dstAdt->action->id.name + 2);
|
||||||
}
|
}
|
||||||
@ -535,7 +535,7 @@ void BKE_animdata_separate_by_basepath(ID *srcID, ID *dstID, ListBase *basepaths
|
|||||||
BLI_remlink(&srcAdt->drivers, fcu);
|
BLI_remlink(&srcAdt->drivers, fcu);
|
||||||
BLI_addtail(&dstAdt->drivers, fcu);
|
BLI_addtail(&dstAdt->drivers, fcu);
|
||||||
|
|
||||||
// TODO: add depsgraph flushing calls?
|
/* TODO: add depsgraph flushing calls? */
|
||||||
|
|
||||||
/* can stop now, as moved already */
|
/* can stop now, as moved already */
|
||||||
break;
|
break;
|
||||||
@ -603,7 +603,7 @@ static char *rna_path_rename_fix(ID *owner_id, const char *prefix, const char *o
|
|||||||
BLI_dynstr_free(ds);
|
BLI_dynstr_free(ds);
|
||||||
|
|
||||||
/* check if the new path will solve our problems */
|
/* check if the new path will solve our problems */
|
||||||
// TODO: will need to check whether this step really helps in practice
|
/* TODO: will need to check whether this step really helps in practice */
|
||||||
if (!verify_paths || check_rna_path_is_valid(owner_id, newPath)) {
|
if (!verify_paths || check_rna_path_is_valid(owner_id, newPath)) {
|
||||||
/* free the old path, and return the new one, since we've solved the issues */
|
/* free the old path, and return the new one, since we've solved the issues */
|
||||||
MEM_freeN(oldpath);
|
MEM_freeN(oldpath);
|
||||||
@ -907,7 +907,7 @@ void BKE_all_animdata_fix_paths_rename(ID *ref_id, const char *prefix, const cha
|
|||||||
/* Finding Tools --------------------------- */
|
/* Finding Tools --------------------------- */
|
||||||
|
|
||||||
/* Find the first path that matches the given criteria */
|
/* Find the first path that matches the given criteria */
|
||||||
// TODO: do we want some method to perform partial matches too?
|
/* TODO: do we want some method to perform partial matches too? */
|
||||||
KS_Path *BKE_keyingset_find_path(KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int UNUSED(group_mode))
|
KS_Path *BKE_keyingset_find_path(KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int UNUSED(group_mode))
|
||||||
{
|
{
|
||||||
KS_Path *ksp;
|
KS_Path *ksp;
|
||||||
@ -936,7 +936,7 @@ KS_Path *BKE_keyingset_find_path(KeyingSet *ks, ID *id, const char group_name[],
|
|||||||
|
|
||||||
/* group */
|
/* group */
|
||||||
if (group_name) {
|
if (group_name) {
|
||||||
// FIXME: these checks need to be coded... for now, it's not too important though
|
/* FIXME: these checks need to be coded... for now, it's not too important though */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if all aspects are ok, return */
|
/* if all aspects are ok, return */
|
||||||
@ -1019,7 +1019,7 @@ KS_Path *BKE_keyingset_add_path(KeyingSet *ks, ID *id, const char group_name[],
|
|||||||
ksp->idtype = GS(id->name);
|
ksp->idtype = GS(id->name);
|
||||||
|
|
||||||
/* just copy path info */
|
/* just copy path info */
|
||||||
// TODO: should array index be checked too?
|
/* TODO: should array index be checked too? */
|
||||||
ksp->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
|
ksp->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
|
||||||
ksp->array_index = array_index;
|
ksp->array_index = array_index;
|
||||||
|
|
||||||
@ -1116,10 +1116,12 @@ void BKE_keyingsets_free(ListBase *list)
|
|||||||
static short animsys_remap_path(AnimMapper *UNUSED(remap), char *path, char **dst)
|
static short animsys_remap_path(AnimMapper *UNUSED(remap), char *path, char **dst)
|
||||||
{
|
{
|
||||||
/* is there a valid remapping table to use? */
|
/* is there a valid remapping table to use? */
|
||||||
//if (remap) {
|
#if 0
|
||||||
|
if (remap) {
|
||||||
/* find a matching entry... to use to remap */
|
/* find a matching entry... to use to remap */
|
||||||
// ...TODO...
|
/* ...TODO... */
|
||||||
//}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* nothing suitable found, so just set dst to look at path (i.e. no alloc/free needed) */
|
/* nothing suitable found, so just set dst to look at path (i.e. no alloc/free needed) */
|
||||||
*dst = path;
|
*dst = path;
|
||||||
@ -1216,8 +1218,8 @@ static short animsys_write_rna_setting(PointerRNA *ptr, char *path, int array_in
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* failed to get path */
|
/* failed to get path */
|
||||||
// XXX don't tag as failed yet though, as there are some legit situations (Action Constraint)
|
/* XXX don't tag as failed yet though, as there are some legit situations (Action Constraint)
|
||||||
// where some channels will not exist, but shouldn't lock up Action
|
* where some channels will not exist, but shouldn't lock up Action */
|
||||||
if (G.debug & G_DEBUG) {
|
if (G.debug & G_DEBUG) {
|
||||||
printf("Animato: Invalid path. ID = '%s', '%s[%d]'\n",
|
printf("Animato: Invalid path. ID = '%s', '%s[%d]'\n",
|
||||||
(ptr && ptr->id.data) ? (((ID *)ptr->id.data)->name + 2) : "<No ID>",
|
(ptr && ptr->id.data) ? (((ID *)ptr->id.data)->name + 2) : "<No ID>",
|
||||||
@ -1429,7 +1431,7 @@ static void nlastrip_evaluate_controls(NlaStrip *strip, float ctime)
|
|||||||
* to lie within extents of the action-clip, so that a steady changing rate of progress through several cycles of the clip
|
* to lie within extents of the action-clip, so that a steady changing rate of progress through several cycles of the clip
|
||||||
* can be achieved easily
|
* can be achieved easily
|
||||||
*/
|
*/
|
||||||
// NOTE: if we add any more of these special cases, we better group them up nicely...
|
/* NOTE: if we add any more of these special cases, we better group them up nicely... */
|
||||||
if ((strip->flag & NLASTRIP_FLAG_USR_TIME) && (strip->flag & NLASTRIP_FLAG_USR_TIME_CYCLIC))
|
if ((strip->flag & NLASTRIP_FLAG_USR_TIME) && (strip->flag & NLASTRIP_FLAG_USR_TIME_CYCLIC))
|
||||||
strip->strip_time = fmod(strip->strip_time - strip->actstart, strip->actend - strip->actstart);
|
strip->strip_time = fmod(strip->strip_time - strip->actstart, strip->actend - strip->actstart);
|
||||||
}
|
}
|
||||||
@ -1511,7 +1513,7 @@ NlaEvalStrip *nlastrips_ctime_get_strip(ListBase *list, ListBase *strips, short
|
|||||||
* - skip if no influence (i.e. same effect as muting the strip)
|
* - skip if no influence (i.e. same effect as muting the strip)
|
||||||
* - negative influence is not supported yet... how would that be defined?
|
* - negative influence is not supported yet... how would that be defined?
|
||||||
*/
|
*/
|
||||||
// TODO: this sounds a bit hacky having a few isolated F-Curves stuck on some data it operates on...
|
/* TODO: this sounds a bit hacky having a few isolated F-Curves stuck on some data it operates on... */
|
||||||
nlastrip_evaluate_controls(estrip, ctime);
|
nlastrip_evaluate_controls(estrip, ctime);
|
||||||
if (estrip->influence <= 0.0f)
|
if (estrip->influence <= 0.0f)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1668,7 +1670,7 @@ static void nlaevalchan_accumulate(NlaEvalChannel *nec, NlaEvalStrip *nes, short
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NLASTRIP_MODE_REPLACE:
|
case NLASTRIP_MODE_REPLACE:
|
||||||
default: // TODO: do we really want to blend by default? it seems more uses might prefer add...
|
default: /* TODO: do we really want to blend by default? it seems more uses might prefer add... */
|
||||||
/* do linear interpolation
|
/* do linear interpolation
|
||||||
* - the influence of the accumulated data (elsewhere, that is called dstweight)
|
* - the influence of the accumulated data (elsewhere, that is called dstweight)
|
||||||
* is 1 - influence, since the strip's influence is srcweight
|
* is 1 - influence, since the strip's influence is srcweight
|
||||||
@ -1864,7 +1866,7 @@ static void nlastrip_evaluate_transition(PointerRNA *ptr, ListBase *channels, Li
|
|||||||
tmp_nes = *nes;
|
tmp_nes = *nes;
|
||||||
|
|
||||||
/* evaluate these strips into a temp-buffer (tmp_channels) */
|
/* evaluate these strips into a temp-buffer (tmp_channels) */
|
||||||
// FIXME: modifier evalation here needs some work...
|
/* FIXME: modifier evalation here needs some work... */
|
||||||
/* first strip */
|
/* first strip */
|
||||||
tmp_nes.strip_mode = NES_TIME_TRANSITION_START;
|
tmp_nes.strip_mode = NES_TIME_TRANSITION_START;
|
||||||
tmp_nes.strip = s1;
|
tmp_nes.strip = s1;
|
||||||
@ -1932,7 +1934,7 @@ void nlastrip_evaluate(PointerRNA *ptr, ListBase *channels, ListBase *modifiers,
|
|||||||
/* to prevent potential infinite recursion problems (i.e. transition strip, beside meta strip containing a transition
|
/* to prevent potential infinite recursion problems (i.e. transition strip, beside meta strip containing a transition
|
||||||
* several levels deep inside it), we tag the current strip as being evaluated, and clear this when we leave
|
* several levels deep inside it), we tag the current strip as being evaluated, and clear this when we leave
|
||||||
*/
|
*/
|
||||||
// TODO: be careful with this flag, since some edit tools may be running and have set this while animplayback was running
|
/* TODO: be careful with this flag, since some edit tools may be running and have set this while animplayback was running */
|
||||||
if (strip->flag & NLASTRIP_FLAG_EDIT_TOUCHED)
|
if (strip->flag & NLASTRIP_FLAG_EDIT_TOUCHED)
|
||||||
return;
|
return;
|
||||||
strip->flag |= NLASTRIP_FLAG_EDIT_TOUCHED;
|
strip->flag |= NLASTRIP_FLAG_EDIT_TOUCHED;
|
||||||
@ -1997,7 +1999,7 @@ void nladata_flush_channels(ListBase *channels)
|
|||||||
RNA_property_enum_set(ptr, prop, (int)value);
|
RNA_property_enum_set(ptr, prop, (int)value);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// can't do anything with other types of property....
|
/* can't do anything with other types of property.... */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2081,7 +2083,7 @@ static void animsys_evaluate_nla(ListBase *echannels, PointerRNA *ptr, AnimData
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* special case - evaluate as if there isn't any NLA data */
|
/* special case - evaluate as if there isn't any NLA data */
|
||||||
// TODO: this is really just a stop-gap measure...
|
/* TODO: this is really just a stop-gap measure... */
|
||||||
animsys_evaluate_action(ptr, adt->action, adt->remap, ctime);
|
animsys_evaluate_action(ptr, adt->action, adt->remap, ctime);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2108,8 +2110,8 @@ static void animsys_calculate_nla(PointerRNA *ptr, AnimData *adt, float ctime)
|
|||||||
{
|
{
|
||||||
ListBase echannels = {NULL, NULL};
|
ListBase echannels = {NULL, NULL};
|
||||||
|
|
||||||
// TODO: need to zero out all channels used, otherwise we have problems with threadsafety
|
/* TODO: need to zero out all channels used, otherwise we have problems with threadsafety
|
||||||
// and also when the user jumps between different times instead of moving sequentially...
|
* and also when the user jumps between different times instead of moving sequentially... */
|
||||||
|
|
||||||
/* evaluate the NLA stack, obtaining a set of values to flush */
|
/* evaluate the NLA stack, obtaining a set of values to flush */
|
||||||
animsys_evaluate_nla(&echannels, ptr, adt, ctime);
|
animsys_evaluate_nla(&echannels, ptr, adt, ctime);
|
||||||
@ -2130,7 +2132,7 @@ static void animsys_calculate_nla(PointerRNA *ptr, AnimData *adt, float ctime)
|
|||||||
#if 0
|
#if 0
|
||||||
AnimOverride *BKE_animsys_validate_override(PointerRNA *UNUSED(ptr), char *UNUSED(path), int UNUSED(array_index))
|
AnimOverride *BKE_animsys_validate_override(PointerRNA *UNUSED(ptr), char *UNUSED(path), int UNUSED(array_index))
|
||||||
{
|
{
|
||||||
// FIXME: need to define how to get overrides
|
/* FIXME: need to define how to get overrides */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -2202,7 +2204,7 @@ void BKE_animsys_evaluate_animdata(Scene *scene, ID *id, AnimData *adt, float ct
|
|||||||
* - NLA before Active Action, as Active Action behaves as 'tweaking track'
|
* - NLA before Active Action, as Active Action behaves as 'tweaking track'
|
||||||
* that overrides 'rough' work in NLA
|
* that overrides 'rough' work in NLA
|
||||||
*/
|
*/
|
||||||
// TODO: need to double check that this all works correctly
|
/* TODO: need to double check that this all works correctly */
|
||||||
if ((recalc & ADT_RECALC_ANIM) || (adt->recalc & ADT_RECALC_ANIM)) {
|
if ((recalc & ADT_RECALC_ANIM) || (adt->recalc & ADT_RECALC_ANIM)) {
|
||||||
/* evaluate NLA data */
|
/* evaluate NLA data */
|
||||||
if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF)) {
|
if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF)) {
|
||||||
|
@ -2049,7 +2049,8 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o
|
|||||||
cross_v3_v3v3(raxis, rmat[1], splineVec);
|
cross_v3_v3v3(raxis, rmat[1], splineVec);
|
||||||
|
|
||||||
rangle = dot_v3v3(rmat[1], splineVec);
|
rangle = dot_v3v3(rmat[1], splineVec);
|
||||||
rangle = acos(MAX2(-1.0f, MIN2(1.0f, rangle)));
|
CLAMP(rangle, -1.0f, 1.0f);
|
||||||
|
rangle = acosf(rangle);
|
||||||
|
|
||||||
/* multiply the magnitude of the angle by the influence of the constraint to
|
/* multiply the magnitude of the angle by the influence of the constraint to
|
||||||
* control the influence of the SplineIK effect
|
* control the influence of the SplineIK effect
|
||||||
|
@ -303,8 +303,8 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath
|
|||||||
//setscreen(G.curscreen);
|
//setscreen(G.curscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: this version patching should really be part of the file-reading code,
|
/* FIXME: this version patching should really be part of the file-reading code,
|
||||||
// but we still get too many unrelated data-corruption crashes otherwise...
|
* but we still get too many unrelated data-corruption crashes otherwise... */
|
||||||
if (G.main->versionfile < 250)
|
if (G.main->versionfile < 250)
|
||||||
do_versions_ipos_to_animato(G.main);
|
do_versions_ipos_to_animato(G.main);
|
||||||
|
|
||||||
|
@ -96,9 +96,9 @@ void readBitmapFontVersion0(ImBuf * ibuf, unsigned char * rect, int step)
|
|||||||
ysize = (bytes + (ibuf->x - 1)) / ibuf->x;
|
ysize = (bytes + (ibuf->x - 1)) / ibuf->x;
|
||||||
|
|
||||||
if (ysize < ibuf->y) {
|
if (ysize < ibuf->y) {
|
||||||
// we're first going to copy all data into a liniar buffer.
|
/* we're first going to copy all data into a liniar buffer.
|
||||||
// step can be 4 or 1 bytes, and the data is not sequential because
|
* step can be 4 or 1 bytes, and the data is not sequential because
|
||||||
// the bitmap was flipped vertically.
|
* the bitmap was flipped vertically. */
|
||||||
|
|
||||||
buffer = MEM_mallocN(bytes, "readBitmapFontVersion0:buffer");
|
buffer = MEM_mallocN(bytes, "readBitmapFontVersion0:buffer");
|
||||||
|
|
||||||
@ -107,18 +107,18 @@ void readBitmapFontVersion0(ImBuf * ibuf, unsigned char * rect, int step)
|
|||||||
buffer[i] = rect[index];
|
buffer[i] = rect[index];
|
||||||
index += step;
|
index += step;
|
||||||
if (index >= linelength) {
|
if (index >= linelength) {
|
||||||
// we've read one line, no skip to the line *before* that
|
/* we've read one line, no skip to the line *before* that */
|
||||||
rect -= linelength;
|
rect -= linelength;
|
||||||
index -= linelength;
|
index -= linelength;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we're now going to endian convert the data
|
/* we're now going to endian convert the data */
|
||||||
|
|
||||||
bmfont = MEM_mallocN(bytes, "readBitmapFontVersion0:bmfont");
|
bmfont = MEM_mallocN(bytes, "readBitmapFontVersion0:bmfont");
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
// first read the header
|
/* first read the header */
|
||||||
bmfont->magic[0] = buffer[index++];
|
bmfont->magic[0] = buffer[index++];
|
||||||
bmfont->magic[1] = buffer[index++];
|
bmfont->magic[1] = buffer[index++];
|
||||||
bmfont->magic[2] = buffer[index++];
|
bmfont->magic[2] = buffer[index++];
|
||||||
@ -151,16 +151,16 @@ void readBitmapFontVersion0(ImBuf * ibuf, unsigned char * rect, int step)
|
|||||||
printf("bytes = %d\n", bytes);
|
printf("bytes = %d\n", bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// we've read the data from the image. Now we're going
|
/* we've read the data from the image. Now we're going
|
||||||
// to crop the image vertically so only the bitmap data
|
* to crop the image vertically so only the bitmap data
|
||||||
// remains visible
|
* remains visible */
|
||||||
|
|
||||||
ibuf->y -= ysize;
|
ibuf->y -= ysize;
|
||||||
ibuf->userdata = bmfont;
|
ibuf->userdata = bmfont;
|
||||||
ibuf->userflags |= IB_BITMAPFONT;
|
ibuf->userflags |= IB_BITMAPFONT;
|
||||||
|
|
||||||
if (ibuf->planes < 32) {
|
if (ibuf->planes < 32) {
|
||||||
// we're going to fake alpha here:
|
/* we're going to fake alpha here: */
|
||||||
calcAlpha(ibuf);
|
calcAlpha(ibuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,21 +176,21 @@ void detectBitmapFont(ImBuf *ibuf)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ibuf != NULL && ibuf->rect != NULL) {
|
if (ibuf != NULL && ibuf->rect != NULL) {
|
||||||
// bitmap must have an x size that is a power of two
|
/* bitmap must have an x size that is a power of two */
|
||||||
if (is_power_of_two(ibuf->x)) {
|
if (is_power_of_two(ibuf->x)) {
|
||||||
rect = (unsigned char *) (ibuf->rect + (ibuf->x * (ibuf->y - 1)));
|
rect = (unsigned char *) (ibuf->rect + (ibuf->x * (ibuf->y - 1)));
|
||||||
// printf ("starts with: %s %c %c %c %c\n", rect, rect[0], rect[1], rect[2], rect[3]);
|
/* printf ("starts with: %s %c %c %c %c\n", rect, rect[0], rect[1], rect[2], rect[3]); */
|
||||||
if (rect[0] == 'B' && rect[1] == 'F' && rect[2] == 'N' && rect[3] == 'T') {
|
if (rect[0] == 'B' && rect[1] == 'F' && rect[2] == 'N' && rect[3] == 'T') {
|
||||||
// printf("found 8bit font !\n");
|
/* printf("found 8bit font !\n");
|
||||||
// round y size down
|
* round y size down
|
||||||
// do the 8 bit font stuff. (not yet)
|
* do the 8 bit font stuff. (not yet) */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// we try all 4 possible combinations
|
/* we try all 4 possible combinations */
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if (rect[0] == 'B' && rect[4] == 'F' && rect[8] == 'N' && rect[12] == 'T') {
|
if (rect[0] == 'B' && rect[4] == 'F' && rect[8] == 'N' && rect[12] == 'T') {
|
||||||
// printf("found 24bit font !\n");
|
/* printf("found 24bit font !\n");
|
||||||
// We're going to parse the file:
|
* We're going to parse the file: */
|
||||||
|
|
||||||
version = (rect[16] << 8) | rect[20];
|
version = (rect[16] << 8) | rect[20];
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ void detectBitmapFont(ImBuf *ibuf)
|
|||||||
printf("detectBitmapFont :Unsupported version %d\n", version);
|
printf("detectBitmapFont :Unsupported version %d\n", version);
|
||||||
}
|
}
|
||||||
|
|
||||||
// on succes ibuf->userdata points to the bitmapfont
|
/* on succes ibuf->userdata points to the bitmapfont */
|
||||||
if (ibuf->userdata) {
|
if (ibuf->userdata) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -221,23 +221,23 @@ int locateGlyph(bmFont *bmfont, unsigned short unicode)
|
|||||||
min = 0;
|
min = 0;
|
||||||
max = bmfont->glyphcount;
|
max = bmfont->glyphcount;
|
||||||
while (1) {
|
while (1) {
|
||||||
// look halfway for glyph
|
/* look halfway for glyph */
|
||||||
current = (min + max) >> 1;
|
current = (min + max) >> 1;
|
||||||
|
|
||||||
if (bmfont->glyphs[current].unicode == unicode) {
|
if (bmfont->glyphs[current].unicode == unicode) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (bmfont->glyphs[current].unicode < unicode) {
|
else if (bmfont->glyphs[current].unicode < unicode) {
|
||||||
// have to move up
|
/* have to move up */
|
||||||
min = current;
|
min = current;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// have to move down
|
/* have to move down */
|
||||||
max = current;
|
max = current;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max - min <= 1) {
|
if (max - min <= 1) {
|
||||||
// unable to locate glyph
|
/* unable to locate glyph */
|
||||||
current = 0;
|
current = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ void matrixGlyph(ImBuf * ibuf, unsigned short unicode,
|
|||||||
*centerx = bmfont->glyphs[0].locx / (float) ibuf->x;
|
*centerx = bmfont->glyphs[0].locx / (float) ibuf->x;
|
||||||
*centery = (ibuf->y - bmfont->glyphs[0].locy) / (float) ibuf->y;
|
*centery = (ibuf->y - bmfont->glyphs[0].locy) / (float) ibuf->y;
|
||||||
|
|
||||||
// 2.0 units is the default size of an object
|
/* 2.0 units is the default size of an object */
|
||||||
|
|
||||||
*movey = 1.0f - *sizey + 2.0f * (bmfont->glyphs[index].ofsy - bmfont->glyphs[0].ofsy) / (float) bmfont->glyphs[0].sizey;
|
*movey = 1.0f - *sizey + 2.0f * (bmfont->glyphs[index].ofsy - bmfont->glyphs[0].ofsy) / (float) bmfont->glyphs[0].sizey;
|
||||||
*movex = *sizex - 1.0f + 2.0f * (bmfont->glyphs[index].ofsx - bmfont->glyphs[0].ofsx) / (float) bmfont->glyphs[0].sizex;
|
*movex = *sizex - 1.0f + 2.0f * (bmfont->glyphs[index].ofsx - bmfont->glyphs[0].ofsx) / (float) bmfont->glyphs[0].sizex;
|
||||||
|
@ -44,18 +44,18 @@
|
|||||||
CSG_DestroyMeshDescriptor(
|
CSG_DestroyMeshDescriptor(
|
||||||
CSG_MeshDescriptor *mesh
|
CSG_MeshDescriptor *mesh
|
||||||
) {
|
) {
|
||||||
// Call mesh descriptors destroy function....
|
/* Call mesh descriptors destroy function.... */
|
||||||
mesh->m_destroy_func(mesh);
|
mesh->m_destroy_func(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destroy function for blender mesh internals.
|
/* Destroy function for blender mesh internals. */
|
||||||
|
|
||||||
static
|
static
|
||||||
void
|
void
|
||||||
CSG_DestroyBlenderMeshInternals(
|
CSG_DestroyBlenderMeshInternals(
|
||||||
CSG_MeshDescriptor *mesh
|
CSG_MeshDescriptor *mesh
|
||||||
) {
|
) {
|
||||||
// Free face and vertex iterators.
|
/* Free face and vertex iterators. */
|
||||||
FreeMeshDescriptors(&(mesh->m_face_iterator),&(mesh->m_vertex_iterator));
|
FreeMeshDescriptors(&(mesh->m_face_iterator),&(mesh->m_vertex_iterator));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,18 +140,18 @@ CSG_AddMeshToBlender(
|
|||||||
|
|
||||||
invert_m4_m4(inv_mat,mesh->base->object->obmat);
|
invert_m4_m4(inv_mat,mesh->base->object->obmat);
|
||||||
|
|
||||||
// Create a new blender mesh object - using 'base' as
|
/* Create a new blender mesh object - using 'base' as
|
||||||
// a template for the new object.
|
* a template for the new object. */
|
||||||
ob_new= AddNewBlenderMesh(mesh->base);
|
ob_new= AddNewBlenderMesh(mesh->base);
|
||||||
|
|
||||||
me_new = ob_new->data;
|
me_new = ob_new->data;
|
||||||
|
|
||||||
// make sure the iterators are reset.
|
/* make sure the iterators are reset. */
|
||||||
mesh->m_face_iterator.Reset(mesh->m_face_iterator.it);
|
mesh->m_face_iterator.Reset(mesh->m_face_iterator.it);
|
||||||
mesh->m_vertex_iterator.Reset(mesh->m_vertex_iterator.it);
|
mesh->m_vertex_iterator.Reset(mesh->m_vertex_iterator.it);
|
||||||
|
|
||||||
// iterate through results of operation and insert into new object
|
/* iterate through results of operation and insert into new object
|
||||||
// see subsurf.c
|
* see subsurf.c */
|
||||||
|
|
||||||
ConvertCSGDescriptorsToMeshObject(
|
ConvertCSGDescriptorsToMeshObject(
|
||||||
ob_new,
|
ob_new,
|
||||||
@ -195,7 +195,7 @@ CSG_PerformOp(
|
|||||||
output->base = mesh1->base;
|
output->base = mesh1->base;
|
||||||
|
|
||||||
if (output->m_descriptor.user_face_vertex_data_size) {
|
if (output->m_descriptor.user_face_vertex_data_size) {
|
||||||
// Then use the only interp function supported
|
/* Then use the only interp function supported */
|
||||||
success =
|
success =
|
||||||
CSG_PerformBooleanOperation(
|
CSG_PerformBooleanOperation(
|
||||||
bool_op,
|
bool_op,
|
||||||
@ -226,7 +226,7 @@ CSG_PerformOp(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the ouput mesh descriptors.
|
/* get the ouput mesh descriptors. */
|
||||||
|
|
||||||
CSG_OutputFaceDescriptor(bool_op,&(output->m_face_iterator));
|
CSG_OutputFaceDescriptor(bool_op,&(output->m_face_iterator));
|
||||||
CSG_OutputVertexDescriptor(bool_op,&(output->m_vertex_iterator));
|
CSG_OutputVertexDescriptor(bool_op,&(output->m_vertex_iterator));
|
||||||
|
@ -1074,7 +1074,7 @@ void BKE_brush_jitter_pos(const Scene *scene, Brush *brush, const float pos[2],
|
|||||||
const int radius = BKE_brush_size_get(scene, brush);
|
const int radius = BKE_brush_size_get(scene, brush);
|
||||||
const int diameter = 2 * radius;
|
const int diameter = 2 * radius;
|
||||||
|
|
||||||
// find random position within a circle of diameter 1
|
/* find random position within a circle of diameter 1 */
|
||||||
do {
|
do {
|
||||||
rand_pos[0] = BLI_frand() - 0.5f;
|
rand_pos[0] = BLI_frand() - 0.5f;
|
||||||
rand_pos[1] = BLI_frand() - 0.5f;
|
rand_pos[1] = BLI_frand() - 0.5f;
|
||||||
|
@ -330,7 +330,7 @@ float nearest_point_in_tri_surface(const float v0[3], const float v1[3], const f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Account for numerical round-off error
|
/* Account for numerical round-off error */
|
||||||
if (sqrDist < FLT_EPSILON)
|
if (sqrDist < FLT_EPSILON)
|
||||||
sqrDist = 0.0f;
|
sqrDist = 0.0f;
|
||||||
|
|
||||||
@ -345,7 +345,7 @@ float nearest_point_in_tri_surface(const float v0[3], const float v1[3], const f
|
|||||||
add_v3_v3v3(z, z, y);
|
add_v3_v3v3(z, z, y);
|
||||||
//sub_v3_v3v3(d, p, z);
|
//sub_v3_v3v3(d, p, z);
|
||||||
copy_v3_v3(nearest, z);
|
copy_v3_v3(nearest, z);
|
||||||
// d = p - ( v0 + S * e0 + T * e1 );
|
//d = p - ( v0 + S * e0 + T * e1 );
|
||||||
}
|
}
|
||||||
*v = lv;
|
*v = lv;
|
||||||
*e = le;
|
*e = le;
|
||||||
|
@ -224,14 +224,14 @@ static BVHTree *bvhtree_build_from_cloth (ClothModifierData *clmd, float epsilon
|
|||||||
verts = cloth->verts;
|
verts = cloth->verts;
|
||||||
mfaces = cloth->mfaces;
|
mfaces = cloth->mfaces;
|
||||||
|
|
||||||
// in the moment, return zero if no faces there
|
/* in the moment, return zero if no faces there */
|
||||||
if (!cloth->numfaces)
|
if (!cloth->numfaces)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// create quadtree with k=26
|
/* create quadtree with k=26 */
|
||||||
bvhtree = BLI_bvhtree_new(cloth->numfaces, epsilon, 4, 26);
|
bvhtree = BLI_bvhtree_new(cloth->numfaces, epsilon, 4, 26);
|
||||||
|
|
||||||
// fill tree
|
/* fill tree */
|
||||||
for (i = 0; i < cloth->numfaces; i++, mfaces++) {
|
for (i = 0; i < cloth->numfaces; i++, mfaces++) {
|
||||||
copy_v3_v3(&co[0*3], verts[mfaces->v1].xold);
|
copy_v3_v3(&co[0*3], verts[mfaces->v1].xold);
|
||||||
copy_v3_v3(&co[1*3], verts[mfaces->v2].xold);
|
copy_v3_v3(&co[1*3], verts[mfaces->v2].xold);
|
||||||
@ -243,7 +243,7 @@ static BVHTree *bvhtree_build_from_cloth (ClothModifierData *clmd, float epsilon
|
|||||||
BLI_bvhtree_insert(bvhtree, i, co, (mfaces->v4 ? 4 : 3));
|
BLI_bvhtree_insert(bvhtree, i, co, (mfaces->v4 ? 4 : 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
// balance tree
|
/* balance tree */
|
||||||
BLI_bvhtree_balance(bvhtree);
|
BLI_bvhtree_balance(bvhtree);
|
||||||
|
|
||||||
return bvhtree;
|
return bvhtree;
|
||||||
|
@ -226,69 +226,69 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
|
|||||||
zero_v3(i2);
|
zero_v3(i2);
|
||||||
zero_v3(i3);
|
zero_v3(i3);
|
||||||
|
|
||||||
// only handle static collisions here
|
/* only handle static collisions here */
|
||||||
if ( collpair->flag & COLLISION_IN_FUTURE )
|
if ( collpair->flag & COLLISION_IN_FUTURE )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// compute barycentric coordinates for both collision points
|
/* compute barycentric coordinates for both collision points */
|
||||||
collision_compute_barycentric ( collpair->pa,
|
collision_compute_barycentric ( collpair->pa,
|
||||||
cloth1->verts[collpair->ap1].txold,
|
cloth1->verts[collpair->ap1].txold,
|
||||||
cloth1->verts[collpair->ap2].txold,
|
cloth1->verts[collpair->ap2].txold,
|
||||||
cloth1->verts[collpair->ap3].txold,
|
cloth1->verts[collpair->ap3].txold,
|
||||||
&w1, &w2, &w3 );
|
&w1, &w2, &w3 );
|
||||||
|
|
||||||
// was: txold
|
/* was: txold */
|
||||||
collision_compute_barycentric ( collpair->pb,
|
collision_compute_barycentric ( collpair->pb,
|
||||||
collmd->current_x[collpair->bp1].co,
|
collmd->current_x[collpair->bp1].co,
|
||||||
collmd->current_x[collpair->bp2].co,
|
collmd->current_x[collpair->bp2].co,
|
||||||
collmd->current_x[collpair->bp3].co,
|
collmd->current_x[collpair->bp3].co,
|
||||||
&u1, &u2, &u3 );
|
&u1, &u2, &u3 );
|
||||||
|
|
||||||
// Calculate relative "velocity".
|
/* Calculate relative "velocity". */
|
||||||
collision_interpolateOnTriangle ( v1, cloth1->verts[collpair->ap1].tv, cloth1->verts[collpair->ap2].tv, cloth1->verts[collpair->ap3].tv, w1, w2, w3 );
|
collision_interpolateOnTriangle ( v1, cloth1->verts[collpair->ap1].tv, cloth1->verts[collpair->ap2].tv, cloth1->verts[collpair->ap3].tv, w1, w2, w3 );
|
||||||
|
|
||||||
collision_interpolateOnTriangle ( v2, collmd->current_v[collpair->bp1].co, collmd->current_v[collpair->bp2].co, collmd->current_v[collpair->bp3].co, u1, u2, u3 );
|
collision_interpolateOnTriangle ( v2, collmd->current_v[collpair->bp1].co, collmd->current_v[collpair->bp2].co, collmd->current_v[collpair->bp3].co, u1, u2, u3 );
|
||||||
|
|
||||||
sub_v3_v3v3(relativeVelocity, v2, v1);
|
sub_v3_v3v3(relativeVelocity, v2, v1);
|
||||||
|
|
||||||
// Calculate the normal component of the relative velocity (actually only the magnitude - the direction is stored in 'normal').
|
/* Calculate the normal component of the relative velocity (actually only the magnitude - the direction is stored in 'normal'). */
|
||||||
magrelVel = dot_v3v3(relativeVelocity, collpair->normal);
|
magrelVel = dot_v3v3(relativeVelocity, collpair->normal);
|
||||||
|
|
||||||
// printf("magrelVel: %f\n", magrelVel);
|
/* printf("magrelVel: %f\n", magrelVel); */
|
||||||
|
|
||||||
// Calculate masses of points.
|
/* Calculate masses of points.
|
||||||
// TODO
|
* TODO */
|
||||||
|
|
||||||
// If v_n_mag < 0 the edges are approaching each other.
|
/* If v_n_mag < 0 the edges are approaching each other. */
|
||||||
if ( magrelVel > ALMOST_ZERO ) {
|
if ( magrelVel > ALMOST_ZERO ) {
|
||||||
// Calculate Impulse magnitude to stop all motion in normal direction.
|
/* Calculate Impulse magnitude to stop all motion in normal direction. */
|
||||||
float magtangent = 0, repulse = 0, d = 0;
|
float magtangent = 0, repulse = 0, d = 0;
|
||||||
double impulse = 0.0;
|
double impulse = 0.0;
|
||||||
float vrel_t_pre[3];
|
float vrel_t_pre[3];
|
||||||
float temp[3], spf;
|
float temp[3], spf;
|
||||||
|
|
||||||
// calculate tangential velocity
|
/* calculate tangential velocity */
|
||||||
copy_v3_v3 ( temp, collpair->normal );
|
copy_v3_v3 ( temp, collpair->normal );
|
||||||
mul_v3_fl(temp, magrelVel);
|
mul_v3_fl(temp, magrelVel);
|
||||||
sub_v3_v3v3(vrel_t_pre, relativeVelocity, temp);
|
sub_v3_v3v3(vrel_t_pre, relativeVelocity, temp);
|
||||||
|
|
||||||
// Decrease in magnitude of relative tangential velocity due to coulomb friction
|
/* Decrease in magnitude of relative tangential velocity due to coulomb friction
|
||||||
// in original formula "magrelVel" should be the "change of relative velocity in normal direction"
|
* in original formula "magrelVel" should be the "change of relative velocity in normal direction" */
|
||||||
magtangent = MIN2(clmd->coll_parms->friction * 0.01f * magrelVel, sqrtf(dot_v3v3(vrel_t_pre, vrel_t_pre)));
|
magtangent = minf(clmd->coll_parms->friction * 0.01f * magrelVel, sqrtf(dot_v3v3(vrel_t_pre, vrel_t_pre)));
|
||||||
|
|
||||||
// Apply friction impulse.
|
/* Apply friction impulse. */
|
||||||
if ( magtangent > ALMOST_ZERO ) {
|
if ( magtangent > ALMOST_ZERO ) {
|
||||||
normalize_v3(vrel_t_pre);
|
normalize_v3(vrel_t_pre);
|
||||||
|
|
||||||
impulse = magtangent / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); // 2.0 *
|
impulse = magtangent / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); /* 2.0 * */
|
||||||
VECADDMUL ( i1, vrel_t_pre, w1 * impulse );
|
VECADDMUL ( i1, vrel_t_pre, w1 * impulse );
|
||||||
VECADDMUL ( i2, vrel_t_pre, w2 * impulse );
|
VECADDMUL ( i2, vrel_t_pre, w2 * impulse );
|
||||||
VECADDMUL ( i3, vrel_t_pre, w3 * impulse );
|
VECADDMUL ( i3, vrel_t_pre, w3 * impulse );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply velocity stopping impulse
|
/* Apply velocity stopping impulse
|
||||||
// I_c = m * v_N / 2.0
|
* I_c = m * v_N / 2.0
|
||||||
// no 2.0 * magrelVel normally, but looks nicer DG
|
* no 2.0 * magrelVel normally, but looks nicer DG */
|
||||||
impulse = magrelVel / ( 1.0 + w1*w1 + w2*w2 + w3*w3 );
|
impulse = magrelVel / ( 1.0 + w1*w1 + w2*w2 + w3*w3 );
|
||||||
|
|
||||||
VECADDMUL ( i1, collpair->normal, w1 * impulse );
|
VECADDMUL ( i1, collpair->normal, w1 * impulse );
|
||||||
@ -300,24 +300,24 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
|
|||||||
VECADDMUL ( i3, collpair->normal, w3 * impulse );
|
VECADDMUL ( i3, collpair->normal, w3 * impulse );
|
||||||
cloth1->verts[collpair->ap3].impulse_count++;
|
cloth1->verts[collpair->ap3].impulse_count++;
|
||||||
|
|
||||||
// Apply repulse impulse if distance too short
|
/* Apply repulse impulse if distance too short
|
||||||
// I_r = -min(dt*kd, m(0, 1d/dt - v_n))
|
* I_r = -min(dt*kd, m(0, 1d/dt - v_n))
|
||||||
// DG: this formula ineeds to be changed for this code since we apply impulses/repulses like this:
|
* DG: this formula ineeds to be changed for this code since we apply impulses/repulses like this:
|
||||||
// v += impulse; x_new = x + v;
|
* v += impulse; x_new = x + v;
|
||||||
// We don't use dt!!
|
* We don't use dt!!
|
||||||
// DG TODO: Fix usage of dt here!
|
* DG TODO: Fix usage of dt here! */
|
||||||
spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
|
spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
|
||||||
|
|
||||||
d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
|
d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
|
||||||
if ( ( magrelVel < 0.1f*d*spf ) && ( d > ALMOST_ZERO ) ) {
|
if ( ( magrelVel < 0.1f*d*spf ) && ( d > ALMOST_ZERO ) ) {
|
||||||
repulse = MIN2 ( d*1.0f/spf, 0.1f*d*spf - magrelVel );
|
repulse = MIN2 ( d*1.0f/spf, 0.1f*d*spf - magrelVel );
|
||||||
|
|
||||||
// stay on the safe side and clamp repulse
|
/* stay on the safe side and clamp repulse */
|
||||||
if ( impulse > ALMOST_ZERO )
|
if ( impulse > ALMOST_ZERO )
|
||||||
repulse = MIN2 ( repulse, 5.0*impulse );
|
repulse = MIN2 ( repulse, 5.0*impulse );
|
||||||
repulse = MAX2 ( impulse, repulse );
|
repulse = MAX2 ( impulse, repulse );
|
||||||
|
|
||||||
impulse = repulse / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); // original 2.0 / 0.25
|
impulse = repulse / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); /* original 2.0 / 0.25 */
|
||||||
VECADDMUL ( i1, collpair->normal, impulse );
|
VECADDMUL ( i1, collpair->normal, impulse );
|
||||||
VECADDMUL ( i2, collpair->normal, impulse );
|
VECADDMUL ( i2, collpair->normal, impulse );
|
||||||
VECADDMUL ( i3, collpair->normal, impulse );
|
VECADDMUL ( i3, collpair->normal, impulse );
|
||||||
@ -326,19 +326,19 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
|
|||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Apply repulse impulse if distance too short
|
/* Apply repulse impulse if distance too short
|
||||||
// I_r = -min(dt*kd, max(0, 1d/dt - v_n))
|
* I_r = -min(dt*kd, max(0, 1d/dt - v_n))
|
||||||
// DG: this formula ineeds to be changed for this code since we apply impulses/repulses like this:
|
* DG: this formula ineeds to be changed for this code since we apply impulses/repulses like this:
|
||||||
// v += impulse; x_new = x + v;
|
* v += impulse; x_new = x + v;
|
||||||
// We don't use dt!!
|
* We don't use dt!! */
|
||||||
float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
|
float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
|
||||||
|
|
||||||
float d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
|
float d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
|
||||||
if ( d > ALMOST_ZERO) {
|
if ( d > ALMOST_ZERO) {
|
||||||
// stay on the safe side and clamp repulse
|
/* stay on the safe side and clamp repulse */
|
||||||
float repulse = d*1.0f/spf;
|
float repulse = d*1.0f/spf;
|
||||||
|
|
||||||
float impulse = repulse / ( 3.0 * ( 1.0f + w1*w1 + w2*w2 + w3*w3 )); // original 2.0 / 0.25
|
float impulse = repulse / ( 3.0 * ( 1.0f + w1*w1 + w2*w2 + w3*w3 )); /* original 2.0 / 0.25 */
|
||||||
|
|
||||||
VECADDMUL ( i1, collpair->normal, impulse );
|
VECADDMUL ( i1, collpair->normal, impulse );
|
||||||
VECADDMUL ( i2, collpair->normal, impulse );
|
VECADDMUL ( i2, collpair->normal, impulse );
|
||||||
@ -805,7 +805,7 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData * clmd, float step, flo
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
if ( clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF ) {
|
if ( clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF ) {
|
||||||
for (l = 0; l < (unsigned int)clmd->coll_parms->self_loop_count; l++) {
|
for (l = 0; l < (unsigned int)clmd->coll_parms->self_loop_count; l++) {
|
||||||
// TODO: add coll quality rounds again
|
/* TODO: add coll quality rounds again */
|
||||||
BVHTreeOverlap *overlap = NULL;
|
BVHTreeOverlap *overlap = NULL;
|
||||||
unsigned int result = 0;
|
unsigned int result = 0;
|
||||||
|
|
||||||
|
@ -1316,7 +1316,7 @@ static void followpath_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *
|
|||||||
bFollowPathConstraint *data = con->data;
|
bFollowPathConstraint *data = con->data;
|
||||||
|
|
||||||
/* get Object transform (loc/rot/size) to determine transformation from path */
|
/* get Object transform (loc/rot/size) to determine transformation from path */
|
||||||
// TODO: this used to be local at one point, but is probably more useful as-is
|
/* TODO: this used to be local at one point, but is probably more useful as-is */
|
||||||
copy_m4_m4(obmat, cob->matrix);
|
copy_m4_m4(obmat, cob->matrix);
|
||||||
|
|
||||||
/* get scaling of object before applying constraint */
|
/* get scaling of object before applying constraint */
|
||||||
@ -2163,7 +2163,7 @@ static void actcon_get_tarmat(bConstraint *con, bConstraintOb *cob, bConstraintT
|
|||||||
Object workob;
|
Object workob;
|
||||||
|
|
||||||
/* evaluate using workob */
|
/* evaluate using workob */
|
||||||
// FIXME: we don't have any consistent standards on limiting effects on object...
|
/* FIXME: we don't have any consistent standards on limiting effects on object... */
|
||||||
what_does_obaction(cob->ob, &workob, NULL, data->act, NULL, t);
|
what_does_obaction(cob->ob, &workob, NULL, data->act, NULL, t);
|
||||||
BKE_object_to_mat4(&workob, ct->matrix);
|
BKE_object_to_mat4(&workob, ct->matrix);
|
||||||
}
|
}
|
||||||
@ -2623,7 +2623,7 @@ static void distlimit_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t
|
|||||||
}
|
}
|
||||||
/* if soft-distance is enabled, start fading once owner is dist-soft from the target */
|
/* if soft-distance is enabled, start fading once owner is dist-soft from the target */
|
||||||
else if (data->flag & LIMITDIST_USESOFT) {
|
else if (data->flag & LIMITDIST_USESOFT) {
|
||||||
// FIXME: there's a problem with "jumping" when this kicks in
|
/* FIXME: there's a problem with "jumping" when this kicks in */
|
||||||
if (dist >= (data->dist - data->soft)) {
|
if (dist >= (data->dist - data->soft)) {
|
||||||
sfac = (float)(data->soft * (1.0f - expf(-(dist - data->dist) / data->soft)) + data->dist);
|
sfac = (float)(data->soft * (1.0f - expf(-(dist - data->dist) / data->soft)) + data->dist);
|
||||||
if (dist != 0.0f) sfac /= dist;
|
if (dist != 0.0f) sfac /= dist;
|
||||||
@ -2989,7 +2989,7 @@ static void rbj_new_data(void *cdata)
|
|||||||
{
|
{
|
||||||
bRigidBodyJointConstraint *data = (bRigidBodyJointConstraint *)cdata;
|
bRigidBodyJointConstraint *data = (bRigidBodyJointConstraint *)cdata;
|
||||||
|
|
||||||
// removed code which set target of this constraint
|
/* removed code which set target of this constraint */
|
||||||
data->type = 1;
|
data->type = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3608,7 +3608,7 @@ static void damptrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t
|
|||||||
|
|
||||||
if (normalize_v3(tarvec) == 0.0f) {
|
if (normalize_v3(tarvec) == 0.0f) {
|
||||||
/* the target is sitting on the owner, so just make them use the same direction vectors */
|
/* the target is sitting on the owner, so just make them use the same direction vectors */
|
||||||
// FIXME: or would it be better to use the pure direction vector?
|
/* FIXME: or would it be better to use the pure direction vector? */
|
||||||
copy_v3_v3(tarvec, obvec);
|
copy_v3_v3(tarvec, obvec);
|
||||||
//copy_v3_v3(tarvec, track_dir_vecs[data->trackflag]);
|
//copy_v3_v3(tarvec, track_dir_vecs[data->trackflag]);
|
||||||
}
|
}
|
||||||
@ -3839,7 +3839,7 @@ static void pivotcon_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *ta
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* get rotation matrix representing the rotation of the owner */
|
/* get rotation matrix representing the rotation of the owner */
|
||||||
// TODO: perhaps we might want to include scaling based on the pivot too?
|
/* TODO: perhaps we might want to include scaling based on the pivot too? */
|
||||||
copy_m3_m4(rotMat, cob->matrix);
|
copy_m3_m4(rotMat, cob->matrix);
|
||||||
normalize_m3(rotMat);
|
normalize_m3(rotMat);
|
||||||
|
|
||||||
@ -4395,7 +4395,7 @@ static bConstraint *add_new_constraint_internal(const char *name, short type)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* if no name is provided, use the generic "Const" name */
|
/* if no name is provided, use the generic "Const" name */
|
||||||
// NOTE: any constraint type that gets here really shouldn't get added...
|
/* NOTE: any constraint type that gets here really shouldn't get added... */
|
||||||
newName = (name && name[0]) ? name : "Const";
|
newName = (name && name[0]) ? name : "Const";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4437,7 +4437,7 @@ static bConstraint *add_new_constraint(Object *ob, bPoseChannel *pchan, const ch
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set type+owner specific immutable settings */
|
/* set type+owner specific immutable settings */
|
||||||
// TODO: does action constraint need anything here - i.e. spaceonce?
|
/* TODO: does action constraint need anything here - i.e. spaceonce? */
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case CONSTRAINT_TYPE_CHILDOF:
|
case CONSTRAINT_TYPE_CHILDOF:
|
||||||
{
|
{
|
||||||
|
@ -337,12 +337,12 @@ static void layerSwap_tface(void *data, const int *corner_indices)
|
|||||||
|
|
||||||
copy_v2_v2(uv[j], tf->uv[source_index]);
|
copy_v2_v2(uv[j], tf->uv[source_index]);
|
||||||
|
|
||||||
// swap pinning flags around
|
/* swap pinning flags around */
|
||||||
if (tf->unwrap & pin_flags[source_index]) {
|
if (tf->unwrap & pin_flags[source_index]) {
|
||||||
unwrap |= pin_flags[j];
|
unwrap |= pin_flags[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
// swap selection flags around
|
/* swap selection flags around */
|
||||||
if (tf->flag & sel_flags[source_index]) {
|
if (tf->flag & sel_flags[source_index]) {
|
||||||
flag |= sel_flags[j];
|
flag |= sel_flags[j];
|
||||||
}
|
}
|
||||||
|
@ -320,7 +320,7 @@ static void dag_add_driver_relation(AnimData *adt, DagForest *dag, DagNode *node
|
|||||||
DRIVER_TARGETS_USED_LOOPER(dvar)
|
DRIVER_TARGETS_USED_LOOPER(dvar)
|
||||||
{
|
{
|
||||||
if (dtar->id) {
|
if (dtar->id) {
|
||||||
// FIXME: other data types need to be added here so that they can work!
|
/* FIXME: other data types need to be added here so that they can work! */
|
||||||
if (GS(dtar->id->name) == ID_OB) {
|
if (GS(dtar->id->name) == ID_OB) {
|
||||||
Object *ob = (Object *)dtar->id;
|
Object *ob = (Object *)dtar->id;
|
||||||
|
|
||||||
@ -399,8 +399,8 @@ static void dag_add_collision_field_relation(DagForest *dag, Scene *scene, Objec
|
|||||||
Base *base;
|
Base *base;
|
||||||
DagNode *node2;
|
DagNode *node2;
|
||||||
|
|
||||||
// would be nice to have a list of colliders here
|
/* would be nice to have a list of colliders here
|
||||||
// so for now walk all objects in scene check 'same layer rule'
|
* so for now walk all objects in scene check 'same layer rule' */
|
||||||
for (base = scene->base.first; base; base = base->next) {
|
for (base = scene->base.first; base; base = base->next) {
|
||||||
if ((base->lay & ob->lay) && base->object->pd) {
|
if ((base->lay & ob->lay) && base->object->pd) {
|
||||||
Object *ob1 = base->object;
|
Object *ob1 = base->object;
|
||||||
@ -858,7 +858,7 @@ DagForest *build_dag(Main *bmain, Scene *sce, short mask)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// cycle detection and solving
|
/* cycle detection and solving */
|
||||||
// solve_cycles(dag);
|
// solve_cycles(dag);
|
||||||
|
|
||||||
return dag;
|
return dag;
|
||||||
@ -1567,7 +1567,7 @@ DagNodeQueue *get_first_ancestors(struct DagForest *dag, void *ob)
|
|||||||
|
|
||||||
node = dag_find_node(dag, ob);
|
node = dag_find_node(dag, ob);
|
||||||
|
|
||||||
// need to go over the whole dag for adj list
|
/* need to go over the whole dag for adj list */
|
||||||
nqueue = queue_create(node->ancestor_count);
|
nqueue = queue_create(node->ancestor_count);
|
||||||
|
|
||||||
node1 = dag->DagNode.first;
|
node1 = dag->DagNode.first;
|
||||||
@ -2205,8 +2205,8 @@ static int object_modifiers_use_time(Object *ob)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: also, should check NLA strips, though for now assume that nobody uses
|
/* XXX: also, should check NLA strips, though for now assume that nobody uses
|
||||||
// that and we can omit that for performance reasons...
|
* that and we can omit that for performance reasons... */
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1386,17 +1386,18 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
|
|||||||
ListBase top_capbase = {NULL, NULL};
|
ListBase top_capbase = {NULL, NULL};
|
||||||
|
|
||||||
for (dlb = dlbev.first; dlb; dlb = dlb->next) {
|
for (dlb = dlbev.first; dlb; dlb = dlb->next) {
|
||||||
int i, start, steps;
|
const float bevfac1 = minf(cu->bevfac1, cu->bevfac2);
|
||||||
float bevfac1 = MIN2(cu->bevfac1, cu->bevfac2), bevfac2 = MAX2(cu->bevfac1, cu->bevfac2);
|
const float bevfac2 = maxf(cu->bevfac1, cu->bevfac2);
|
||||||
float firstblend = 0.0f, lastblend = 0.0f;
|
float firstblend = 0.0f, lastblend = 0.0f;
|
||||||
|
int i, start, steps;
|
||||||
|
|
||||||
if (cu->bevfac1 - cu->bevfac2 == 0.0f)
|
if (bevfac2 - bevfac1 == 0.0f)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
start = (int)(bevfac1 * (bl->nr - 1));
|
start = (int)(bevfac1 * (bl->nr - 1));
|
||||||
steps = 2 + (int)((bevfac2) * (bl->nr - 1)) - start;
|
steps = 2 + (int)((bevfac2) * (bl->nr - 1)) - start;
|
||||||
firstblend = 1.0f - ((float)bevfac1 * (bl->nr - 1) - (int)((float)bevfac1 * (bl->nr - 1)));
|
firstblend = 1.0f - (bevfac1 * (bl->nr - 1) - (int)(bevfac1 * (bl->nr - 1)));
|
||||||
lastblend = (float)bevfac2 * (bl->nr - 1) - (int)((float)bevfac2 * (bl->nr - 1));
|
lastblend = bevfac2 * (bl->nr - 1) - (int)(bevfac2 * (bl->nr - 1));
|
||||||
|
|
||||||
if (steps > bl->nr) {
|
if (steps > bl->nr) {
|
||||||
steps = bl->nr;
|
steps = bl->nr;
|
||||||
|
@ -3417,7 +3417,9 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface,
|
|||||||
|
|
||||||
sampleStrength *= sample_factor;
|
sampleStrength *= sample_factor;
|
||||||
}
|
}
|
||||||
else continue;
|
else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* velocity brush, only do on main sample */
|
/* velocity brush, only do on main sample */
|
||||||
if (brush->flags & MOD_DPAINT_USES_VELOCITY && ss == 0 && brushVelocity) {
|
if (brush->flags & MOD_DPAINT_USES_VELOCITY && ss == 0 && brushVelocity) {
|
||||||
|
@ -393,7 +393,7 @@ void pd_point_from_soft(Scene *scene, float *loc, float *vel, int index, Effecte
|
|||||||
// triangle - ray callback function
|
// triangle - ray callback function
|
||||||
static void eff_tri_ray_hit(void *UNUSED(userData), int UNUSED(index), const BVHTreeRay *UNUSED(ray), BVHTreeRayHit *hit)
|
static void eff_tri_ray_hit(void *UNUSED(userData), int UNUSED(index), const BVHTreeRay *UNUSED(ray), BVHTreeRayHit *hit)
|
||||||
{
|
{
|
||||||
// whenever we hit a bounding box, we don't check further
|
/* whenever we hit a bounding box, we don't check further */
|
||||||
hit->dist = -1;
|
hit->dist = -1;
|
||||||
hit->index = 1;
|
hit->index = 1;
|
||||||
}
|
}
|
||||||
@ -418,7 +418,7 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
|
|||||||
negate_v3_v3(norm, efd->vec_to_point);
|
negate_v3_v3(norm, efd->vec_to_point);
|
||||||
len = normalize_v3(norm);
|
len = normalize_v3(norm);
|
||||||
|
|
||||||
// check all collision objects
|
/* check all collision objects */
|
||||||
for (col = colls->first; col; col = col->next) {
|
for (col = colls->first; col; col = col->next) {
|
||||||
CollisionModifierData *collmd = col->collmd;
|
CollisionModifierData *collmd = col->collmd;
|
||||||
|
|
||||||
@ -431,11 +431,11 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
|
|||||||
hit.index = -1;
|
hit.index = -1;
|
||||||
hit.dist = len + FLT_EPSILON;
|
hit.dist = len + FLT_EPSILON;
|
||||||
|
|
||||||
// check if the way is blocked
|
/* check if the way is blocked */
|
||||||
if (BLI_bvhtree_ray_cast(collmd->bvhtree, point->loc, norm, 0.0f, &hit, eff_tri_ray_hit, NULL)>=0) {
|
if (BLI_bvhtree_ray_cast(collmd->bvhtree, point->loc, norm, 0.0f, &hit, eff_tri_ray_hit, NULL)>=0) {
|
||||||
absorption= col->ob->pd->absorption;
|
absorption= col->ob->pd->absorption;
|
||||||
|
|
||||||
// visibility is only between 0 and 1, calculated from 1-absorption
|
/* visibility is only between 0 and 1, calculated from 1-absorption */
|
||||||
visibility *= CLAMPIS(1.0f-absorption, 0.0f, 1.0f);
|
visibility *= CLAMPIS(1.0f-absorption, 0.0f, 1.0f);
|
||||||
|
|
||||||
if (visibility <= 0.0f)
|
if (visibility <= 0.0f)
|
||||||
@ -1006,7 +1006,7 @@ void pdDoEffectors(ListBase *effectors, ListBase *colliders, EffectorWeights *we
|
|||||||
|
|
||||||
do_physical_effector(eff, &efd, point, force);
|
do_physical_effector(eff, &efd, point, force);
|
||||||
|
|
||||||
// for softbody backward compatibility
|
/* for softbody backward compatibility */
|
||||||
if (point->flag & PE_WIND_AS_SPEED && impulse) {
|
if (point->flag & PE_WIND_AS_SPEED && impulse) {
|
||||||
sub_v3_v3v3(temp2, force, temp1);
|
sub_v3_v3v3(temp2, force, temp1);
|
||||||
sub_v3_v3v3(impulse, impulse, temp2);
|
sub_v3_v3v3(impulse, impulse, temp2);
|
||||||
|
@ -422,7 +422,7 @@ int binarysearch_bezt_index(BezTriple array[], float frame, int arraylen, short
|
|||||||
if (loopbreaker == (maxloop - 1)) {
|
if (loopbreaker == (maxloop - 1)) {
|
||||||
printf("Error: binarysearch_bezt_index() was taking too long\n");
|
printf("Error: binarysearch_bezt_index() was taking too long\n");
|
||||||
|
|
||||||
// include debug info
|
/* include debug info */
|
||||||
printf("\tround = %d: start = %d, end = %d, arraylen = %d\n", loopbreaker, start, end, arraylen);
|
printf("\tround = %d: start = %d, end = %d, arraylen = %d\n", loopbreaker, start, end, arraylen);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,7 +636,7 @@ short fcurve_are_keyframes_usable(FCurve *fcu)
|
|||||||
FModifier *fcm;
|
FModifier *fcm;
|
||||||
|
|
||||||
/* check modifiers from last to first, as last will be more influential */
|
/* check modifiers from last to first, as last will be more influential */
|
||||||
// TODO: optionally, only check modifier if it is the active one...
|
/* TODO: optionally, only check modifier if it is the active one... */
|
||||||
for (fcm = fcu->modifiers.last; fcm; fcm = fcm->prev) {
|
for (fcm = fcu->modifiers.last; fcm; fcm = fcm->prev) {
|
||||||
/* ignore if muted/disabled */
|
/* ignore if muted/disabled */
|
||||||
if (fcm->flag & (FMODIFIER_FLAG_DISABLED | FMODIFIER_FLAG_MUTED))
|
if (fcm->flag & (FMODIFIER_FLAG_DISABLED | FMODIFIER_FLAG_MUTED))
|
||||||
@ -748,7 +748,7 @@ void fcurve_store_samples(FCurve *fcu, void *data, int start, int end, FcuSample
|
|||||||
int cfra;
|
int cfra;
|
||||||
|
|
||||||
/* sanity checks */
|
/* sanity checks */
|
||||||
// TODO: make these tests report errors using reports not printf's
|
/* TODO: make these tests report errors using reports not printf's */
|
||||||
if (ELEM(NULL, fcu, sample_cb)) {
|
if (ELEM(NULL, fcu, sample_cb)) {
|
||||||
printf("Error: No F-Curve with F-Curve Modifiers to Bake\n");
|
printf("Error: No F-Curve with F-Curve Modifiers to Bake\n");
|
||||||
return;
|
return;
|
||||||
@ -1018,7 +1018,7 @@ static float dtar_get_prop_val(ChannelDriver *driver, DriverTarget *dtar)
|
|||||||
id = dtar_id_ensure_proxy_from(dtar->id);
|
id = dtar_id_ensure_proxy_from(dtar->id);
|
||||||
|
|
||||||
/* error check for missing pointer... */
|
/* error check for missing pointer... */
|
||||||
// TODO: tag the specific target too as having issues
|
/* TODO: tag the specific target too as having issues */
|
||||||
if (id == NULL) {
|
if (id == NULL) {
|
||||||
printf("Error: driver has an invalid target to use\n");
|
printf("Error: driver has an invalid target to use\n");
|
||||||
if (G.debug & G_DEBUG) printf("\tpath = %s\n", dtar->rna_path);
|
if (G.debug & G_DEBUG) printf("\tpath = %s\n", dtar->rna_path);
|
||||||
@ -1152,14 +1152,14 @@ static float dvar_eval_rotDiff(ChannelDriver *driver, DriverVar *dvar)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* evaluate 'location difference' driver variable */
|
/* evaluate 'location difference' driver variable */
|
||||||
// TODO: this needs to take into account space conversions...
|
/* TODO: this needs to take into account space conversions... */
|
||||||
static float dvar_eval_locDiff(ChannelDriver *driver, DriverVar *dvar)
|
static float dvar_eval_locDiff(ChannelDriver *driver, DriverVar *dvar)
|
||||||
{
|
{
|
||||||
float loc1[3] = {0.0f, 0.0f, 0.0f};
|
float loc1[3] = {0.0f, 0.0f, 0.0f};
|
||||||
float loc2[3] = {0.0f, 0.0f, 0.0f};
|
float loc2[3] = {0.0f, 0.0f, 0.0f};
|
||||||
|
|
||||||
/* get two location values */
|
/* get two location values */
|
||||||
// NOTE: for now, these are all just worldspace
|
/* NOTE: for now, these are all just worldspace */
|
||||||
DRIVER_TARGETS_USED_LOOPER(dvar)
|
DRIVER_TARGETS_USED_LOOPER(dvar)
|
||||||
{
|
{
|
||||||
/* get pointer to loc values to store in */
|
/* get pointer to loc values to store in */
|
||||||
@ -1206,7 +1206,7 @@ static float dvar_eval_locDiff(ChannelDriver *driver, DriverVar *dvar)
|
|||||||
/* object */
|
/* object */
|
||||||
if (dtar->flag & DTAR_FLAG_LOCALSPACE) {
|
if (dtar->flag & DTAR_FLAG_LOCALSPACE) {
|
||||||
if (dtar->flag & DTAR_FLAG_LOCAL_CONSTS) {
|
if (dtar->flag & DTAR_FLAG_LOCAL_CONSTS) {
|
||||||
// XXX: this should practically be the same as transform space...
|
/* XXX: this should practically be the same as transform space... */
|
||||||
float mat[4][4];
|
float mat[4][4];
|
||||||
|
|
||||||
/* extract transform just like how the constraints do it! */
|
/* extract transform just like how the constraints do it! */
|
||||||
@ -1796,7 +1796,7 @@ static int findzero(float x, float q0, float q1, float q2, float q3, float *o)
|
|||||||
c = c0;
|
c = c0;
|
||||||
|
|
||||||
if (a != 0.0) {
|
if (a != 0.0) {
|
||||||
// discriminant
|
/* discriminant */
|
||||||
p = b * b - 4 * a * c;
|
p = b * b - 4 * a * c;
|
||||||
|
|
||||||
if (p > 0) {
|
if (p > 0) {
|
||||||
|
@ -433,7 +433,7 @@ static void fcm_envelope_verify(FModifier *fcm)
|
|||||||
|
|
||||||
/* if the are points, perform bubble-sort on them, as user may have changed the order */
|
/* if the are points, perform bubble-sort on them, as user may have changed the order */
|
||||||
if (env->data) {
|
if (env->data) {
|
||||||
// XXX todo...
|
/* XXX todo... */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -463,7 +463,7 @@ static void fcm_envelope_evaluate(FCurve *UNUSED(fcu), FModifier *fcm, float *cv
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* evaltime occurs somewhere between segments */
|
/* evaltime occurs somewhere between segments */
|
||||||
// TODO: implement binary search for this to make it faster?
|
/* TODO: implement binary search for this to make it faster? */
|
||||||
for (a = 0; prevfed && fed && (a < env->totvert - 1); a++, prevfed = fed, fed++) {
|
for (a = 0; prevfed && fed && (a < env->totvert - 1); a++, prevfed = fed, fed++) {
|
||||||
/* evaltime occurs within the interval defined by these two envelope points */
|
/* evaltime occurs within the interval defined by these two envelope points */
|
||||||
if ((prevfed->time <= evaltime) && (fed->time >= evaltime)) {
|
if ((prevfed->time <= evaltime) && (fed->time >= evaltime)) {
|
||||||
@ -539,7 +539,7 @@ static float fcm_cycles_time(FCurve *fcu, FModifier *fcm, float UNUSED(cvalue),
|
|||||||
int cycles = 0, ofs = 0;
|
int cycles = 0, ofs = 0;
|
||||||
|
|
||||||
/* check if modifier is first in stack, otherwise disable ourself... */
|
/* check if modifier is first in stack, otherwise disable ourself... */
|
||||||
// FIXME...
|
/* FIXME... */
|
||||||
if (fcm->prev) {
|
if (fcm->prev) {
|
||||||
fcm->flag |= FMODIFIER_FLAG_DISABLED;
|
fcm->flag |= FMODIFIER_FLAG_DISABLED;
|
||||||
return evaltime;
|
return evaltime;
|
||||||
@ -883,7 +883,7 @@ static void fcm_stepped_new_data(void *mdata)
|
|||||||
FMod_Stepped *data = (FMod_Stepped *)mdata;
|
FMod_Stepped *data = (FMod_Stepped *)mdata;
|
||||||
|
|
||||||
/* just need to set the step-size to 2-frames by default */
|
/* just need to set the step-size to 2-frames by default */
|
||||||
// XXX: or would 5 be more normal?
|
/* XXX: or would 5 be more normal? */
|
||||||
data->step_size = 2.0f;
|
data->step_size = 2.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1005,7 +1005,7 @@ FModifier *add_fmodifier(ListBase *modifiers, int type)
|
|||||||
/* special checks for whether modifier can be added */
|
/* special checks for whether modifier can be added */
|
||||||
if ((modifiers->first) && (type == FMODIFIER_TYPE_CYCLES)) {
|
if ((modifiers->first) && (type == FMODIFIER_TYPE_CYCLES)) {
|
||||||
/* cycles modifier must be first in stack, so for now, don't add if it can't be */
|
/* cycles modifier must be first in stack, so for now, don't add if it can't be */
|
||||||
// TODO: perhaps there is some better way, but for now,
|
/* TODO: perhaps there is some better way, but for now, */
|
||||||
printf("Error: Cannot add 'Cycles' modifier to F-Curve, as 'Cycles' modifier can only be first in stack.\n");
|
printf("Error: Cannot add 'Cycles' modifier to F-Curve, as 'Cycles' modifier can only be first in stack.\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1104,7 +1104,7 @@ int remove_fmodifier(ListBase *modifiers, FModifier *fcm)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// XXX this case can probably be removed some day, as it shouldn't happen...
|
/* XXX this case can probably be removed some day, as it shouldn't happen... */
|
||||||
printf("remove_fmodifier() - no modifier stack given\n");
|
printf("remove_fmodifier() - no modifier stack given\n");
|
||||||
MEM_freeN(fcm);
|
MEM_freeN(fcm);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1343,7 +1343,7 @@ void fcurve_bake_modifiers(FCurve *fcu, int start, int end)
|
|||||||
ChannelDriver *driver;
|
ChannelDriver *driver;
|
||||||
|
|
||||||
/* sanity checks */
|
/* sanity checks */
|
||||||
// TODO: make these tests report errors using reports not printf's
|
/* TODO: make these tests report errors using reports not printf's */
|
||||||
if (ELEM(NULL, fcu, fcu->modifiers.first)) {
|
if (ELEM(NULL, fcu, fcu->modifiers.first)) {
|
||||||
printf("Error: No F-Curve with F-Curve Modifiers to Bake\n");
|
printf("Error: No F-Curve with F-Curve Modifiers to Bake\n");
|
||||||
return;
|
return;
|
||||||
|
@ -133,7 +133,7 @@ struct TmpFont *BKE_vfont_find_tmpfont(VFont *vfont)
|
|||||||
|
|
||||||
if (vfont == NULL) return NULL;
|
if (vfont == NULL) return NULL;
|
||||||
|
|
||||||
// Try finding the font from font list
|
/* Try finding the font from font list */
|
||||||
tmpfnt = ttfdata.first;
|
tmpfnt = ttfdata.first;
|
||||||
while (tmpfnt) {
|
while (tmpfnt) {
|
||||||
if (tmpfnt->vfont == vfont)
|
if (tmpfnt->vfont == vfont)
|
||||||
@ -150,10 +150,10 @@ static VFontData *vfont_get_data(Main *bmain, VFont *vfont)
|
|||||||
|
|
||||||
if (vfont == NULL) return NULL;
|
if (vfont == NULL) return NULL;
|
||||||
|
|
||||||
// Try finding the font from font list
|
/* Try finding the font from font list */
|
||||||
tmpfnt = BKE_vfont_find_tmpfont(vfont);
|
tmpfnt = BKE_vfont_find_tmpfont(vfont);
|
||||||
|
|
||||||
// And then set the data
|
/* And then set the data */
|
||||||
if (!vfont->data) {
|
if (!vfont->data) {
|
||||||
PackedFile *pf;
|
PackedFile *pf;
|
||||||
|
|
||||||
@ -164,14 +164,14 @@ static VFontData *vfont_get_data(Main *bmain, VFont *vfont)
|
|||||||
if (vfont->packedfile) {
|
if (vfont->packedfile) {
|
||||||
pf = vfont->packedfile;
|
pf = vfont->packedfile;
|
||||||
|
|
||||||
// We need to copy a tmp font to memory unless it is already there
|
/* We need to copy a tmp font to memory unless it is already there */
|
||||||
if (!tmpfnt) {
|
if (!tmpfnt) {
|
||||||
tpf = MEM_callocN(sizeof(*tpf), "PackedFile");
|
tpf = MEM_callocN(sizeof(*tpf), "PackedFile");
|
||||||
tpf->data = MEM_mallocN(pf->size, "packFile");
|
tpf->data = MEM_mallocN(pf->size, "packFile");
|
||||||
tpf->size = pf->size;
|
tpf->size = pf->size;
|
||||||
memcpy(tpf->data, pf->data, pf->size);
|
memcpy(tpf->data, pf->data, pf->size);
|
||||||
|
|
||||||
// Add temporary packed file to globals
|
/* Add temporary packed file to globals */
|
||||||
tmpfnt = (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
|
tmpfnt = (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
|
||||||
tmpfnt->pf = tpf;
|
tmpfnt->pf = tpf;
|
||||||
tmpfnt->vfont = vfont;
|
tmpfnt->vfont = vfont;
|
||||||
@ -184,7 +184,7 @@ static VFontData *vfont_get_data(Main *bmain, VFont *vfont)
|
|||||||
if (!tmpfnt) {
|
if (!tmpfnt) {
|
||||||
tpf = newPackedFile(NULL, vfont->name, ID_BLEND_PATH(bmain, &vfont->id));
|
tpf = newPackedFile(NULL, vfont->name, ID_BLEND_PATH(bmain, &vfont->id));
|
||||||
|
|
||||||
// Add temporary packed file to globals
|
/* Add temporary packed file to globals */
|
||||||
tmpfnt = (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
|
tmpfnt = (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
|
||||||
tmpfnt->pf = tpf;
|
tmpfnt->pf = tpf;
|
||||||
tmpfnt->vfont = vfont;
|
tmpfnt->vfont = vfont;
|
||||||
@ -251,12 +251,12 @@ VFont *BKE_vfont_load(Main *bmain, const char *name)
|
|||||||
}
|
}
|
||||||
BLI_strncpy(vfont->name, name, sizeof(vfont->name));
|
BLI_strncpy(vfont->name, name, sizeof(vfont->name));
|
||||||
|
|
||||||
// if autopack is on store the packedfile in de font structure
|
/* if autopack is on store the packedfile in de font structure */
|
||||||
if (!is_builtin && (G.fileflags & G_AUTOPACK)) {
|
if (!is_builtin && (G.fileflags & G_AUTOPACK)) {
|
||||||
vfont->packedfile = pf;
|
vfont->packedfile = pf;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not add FO_BUILTIN_NAME to temporary listbase
|
/* Do not add FO_BUILTIN_NAME to temporary listbase */
|
||||||
if (strcmp(filename, FO_BUILTIN_NAME)) {
|
if (strcmp(filename, FO_BUILTIN_NAME)) {
|
||||||
tmpfnt = (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
|
tmpfnt = (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
|
||||||
tmpfnt->pf = tpf;
|
tmpfnt->pf = tpf;
|
||||||
@ -265,7 +265,7 @@ VFont *BKE_vfont_load(Main *bmain, const char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free the packed file
|
/* Free the packed file */
|
||||||
if (!vfont || vfont->packedfile != pf) {
|
if (!vfont || vfont->packedfile != pf) {
|
||||||
freePackedFile(pf);
|
freePackedFile(pf);
|
||||||
}
|
}
|
||||||
@ -390,11 +390,11 @@ static void buildchar(Main *bmain, Curve *cu, unsigned long character, CharInfo
|
|||||||
|
|
||||||
che = find_vfont_char(vfd, character);
|
che = find_vfont_char(vfd, character);
|
||||||
|
|
||||||
// Select the glyph data
|
/* Select the glyph data */
|
||||||
if (che)
|
if (che)
|
||||||
nu1 = che->nurbsbase.first;
|
nu1 = che->nurbsbase.first;
|
||||||
|
|
||||||
// Create the character
|
/* Create the character */
|
||||||
while (nu1) {
|
while (nu1) {
|
||||||
bezt1 = nu1->bezt;
|
bezt1 = nu1->bezt;
|
||||||
if (bezt1) {
|
if (bezt1) {
|
||||||
@ -508,7 +508,7 @@ int BKE_vfont_select_get(Object *ob, int *start, int *end)
|
|||||||
|
|
||||||
static float char_width(Curve *cu, VChar *che, CharInfo *info)
|
static float char_width(Curve *cu, VChar *che, CharInfo *info)
|
||||||
{
|
{
|
||||||
// The character wasn't found, propably ascii = 0, then the width shall be 0 as well
|
/* The character wasn't found, propably ascii = 0, then the width shall be 0 as well */
|
||||||
if (che == NULL) {
|
if (che == NULL) {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
@ -543,20 +543,20 @@ struct chartrans *BKE_vfont_to_curve(Main *bmain, Scene *scene, Object *ob, int
|
|||||||
|
|
||||||
if (ob->type != OB_FONT) return NULL;
|
if (ob->type != OB_FONT) return NULL;
|
||||||
|
|
||||||
// Set font data
|
/* Set font data */
|
||||||
cu = (Curve *) ob->data;
|
cu = (Curve *) ob->data;
|
||||||
vfont = cu->vfont;
|
vfont = cu->vfont;
|
||||||
|
|
||||||
if (cu->str == NULL) return NULL;
|
if (cu->str == NULL) return NULL;
|
||||||
if (vfont == NULL) return NULL;
|
if (vfont == NULL) return NULL;
|
||||||
|
|
||||||
// Create unicode string
|
/* Create unicode string */
|
||||||
utf8len = BLI_strlen_utf8(cu->str);
|
utf8len = BLI_strlen_utf8(cu->str);
|
||||||
mem = MEM_callocN(((utf8len + 1) * sizeof(wchar_t)), "convertedmem");
|
mem = MEM_callocN(((utf8len + 1) * sizeof(wchar_t)), "convertedmem");
|
||||||
|
|
||||||
BLI_strncpy_wchar_from_utf8(mem, cu->str, utf8len + 1);
|
BLI_strncpy_wchar_from_utf8(mem, cu->str, utf8len + 1);
|
||||||
|
|
||||||
// Count the wchar_t string length
|
/* Count the wchar_t string length */
|
||||||
slen = wcslen(mem);
|
slen = wcslen(mem);
|
||||||
|
|
||||||
if (cu->ulheight == 0.0f)
|
if (cu->ulheight == 0.0f)
|
||||||
@ -612,7 +612,7 @@ struct chartrans *BKE_vfont_to_curve(Main *bmain, Scene *scene, Object *ob, int
|
|||||||
curbox = 0;
|
curbox = 0;
|
||||||
for (i = 0; i <= slen; i++) {
|
for (i = 0; i <= slen; i++) {
|
||||||
makebreak:
|
makebreak:
|
||||||
// Characters in the list
|
/* Characters in the list */
|
||||||
info = &(custrinfo[i]);
|
info = &(custrinfo[i]);
|
||||||
ascii = mem[i];
|
ascii = mem[i];
|
||||||
if (info->flag & CU_CHINFO_SMALLCAPS) {
|
if (info->flag & CU_CHINFO_SMALLCAPS) {
|
||||||
@ -664,7 +664,7 @@ makebreak:
|
|||||||
|
|
||||||
twidth = char_width(cu, che, info);
|
twidth = char_width(cu, che, info);
|
||||||
|
|
||||||
// Calculate positions
|
/* Calculate positions */
|
||||||
if ((tb->w != 0.0f) && (ct->dobreak == 0) && ((xof - (tb->x / cu->fsize) + twidth) * cu->fsize) > tb->w + cu->xof * cu->fsize) {
|
if ((tb->w != 0.0f) && (ct->dobreak == 0) && ((xof - (tb->x / cu->fsize) + twidth) * cu->fsize) > tb->w + cu->xof * cu->fsize) {
|
||||||
// fprintf(stderr, "linewidth exceeded: %c%c%c...\n", mem[i], mem[i+1], mem[i+2]);
|
// fprintf(stderr, "linewidth exceeded: %c%c%c...\n", mem[i], mem[i+1], mem[i+2]);
|
||||||
for (j = i; j && (mem[j] != '\n') && (mem[j] != '\r') && (chartransdata[j].dobreak == 0); j--) {
|
for (j = i; j && (mem[j] != '\n') && (mem[j] != '\r') && (chartransdata[j].dobreak == 0); j--) {
|
||||||
@ -699,7 +699,7 @@ makebreak:
|
|||||||
|
|
||||||
yof -= linedist;
|
yof -= linedist;
|
||||||
|
|
||||||
maxlen = MAX2(maxlen, (xof - tb->x / cu->fsize));
|
maxlen = maxf(maxlen, (xof - tb->x / cu->fsize));
|
||||||
linedata[lnr] = xof - tb->x / cu->fsize;
|
linedata[lnr] = xof - tb->x / cu->fsize;
|
||||||
linedata2[lnr] = cnr;
|
linedata2[lnr] = cnr;
|
||||||
linedata3[lnr] = tb->w / cu->fsize;
|
linedata3[lnr] = tb->w / cu->fsize;
|
||||||
@ -762,7 +762,7 @@ makebreak:
|
|||||||
}
|
}
|
||||||
else wsfac = 1.0f;
|
else wsfac = 1.0f;
|
||||||
|
|
||||||
// Set the width of the character
|
/* Set the width of the character */
|
||||||
twidth = char_width(cu, che, info);
|
twidth = char_width(cu, che, info);
|
||||||
|
|
||||||
xof += (twidth * wsfac * (1.0f + (info->kern / 40.0f)) ) + xtrax;
|
xof += (twidth * wsfac * (1.0f + (info->kern / 40.0f)) ) + xtrax;
|
||||||
@ -781,10 +781,10 @@ makebreak:
|
|||||||
if (ascii == '\n' || ascii == '\r' || ct->dobreak) cu->lines++;
|
if (ascii == '\n' || ascii == '\r' || ct->dobreak) cu->lines++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// linedata is now: width of line
|
/* linedata is now: width of line
|
||||||
// linedata2 is now: number of characters
|
* linedata2 is now: number of characters
|
||||||
// linedata3 is now: maxlen of that line
|
* linedata3 is now: maxlen of that line
|
||||||
// linedata4 is now: number of whitespaces of line
|
* linedata4 is now: number of whitespaces of line */
|
||||||
|
|
||||||
if (cu->spacemode != CU_LEFT) {
|
if (cu->spacemode != CU_LEFT) {
|
||||||
ct = chartransdata;
|
ct = chartransdata;
|
||||||
@ -1023,7 +1023,7 @@ makebreak:
|
|||||||
/* printf("Error: Illegal material index (%d) in text object, setting to 0\n", info->mat_nr); */
|
/* printf("Error: Illegal material index (%d) in text object, setting to 0\n", info->mat_nr); */
|
||||||
info->mat_nr = 0;
|
info->mat_nr = 0;
|
||||||
}
|
}
|
||||||
// We do not want to see any character for \n or \r
|
/* We do not want to see any character for \n or \r */
|
||||||
if (cha != '\n' && cha != '\r')
|
if (cha != '\n' && cha != '\r')
|
||||||
buildchar(bmain, cu, cha, info, ct->xof, ct->yof, ct->rot, i);
|
buildchar(bmain, cu, cha, info, ct->xof, ct->yof, ct->rot, i);
|
||||||
|
|
||||||
@ -1035,8 +1035,8 @@ makebreak:
|
|||||||
{
|
{
|
||||||
uloverlap = xtrax + 0.1f;
|
uloverlap = xtrax + 0.1f;
|
||||||
}
|
}
|
||||||
// Find the character, the characters has to be in the memory already
|
/* Find the character, the characters has to be in the memory already
|
||||||
// since character checking has been done earlier already.
|
* since character checking has been done earlier already. */
|
||||||
che = find_vfont_char(vfd, cha);
|
che = find_vfont_char(vfd, cha);
|
||||||
|
|
||||||
twidth = char_width(cu, che, info);
|
twidth = char_width(cu, che, info);
|
||||||
|
@ -33,11 +33,13 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "BLI_utildefines.h"
|
||||||
|
#include "BLI_string.h"
|
||||||
|
#include "BLI_listbase.h"
|
||||||
|
|
||||||
#include "BKE_idprop.h"
|
#include "BKE_idprop.h"
|
||||||
#include "BKE_library.h"
|
#include "BKE_library.h"
|
||||||
|
|
||||||
#include "BLI_blenlib.h"
|
|
||||||
|
|
||||||
#include "MEM_guardedalloc.h"
|
#include "MEM_guardedalloc.h"
|
||||||
|
|
||||||
/* IDPropertyTemplate is a union in DNA_ID.h */
|
/* IDPropertyTemplate is a union in DNA_ID.h */
|
||||||
@ -122,11 +124,10 @@ IDProperty *IDP_GetIndexArray(IDProperty *prop, int index)
|
|||||||
return GETPROP(prop, index);
|
return GETPROP(prop, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
IDProperty *IDP_AppendArray(IDProperty *prop, IDProperty *item)
|
void IDP_AppendArray(IDProperty *prop, IDProperty *item)
|
||||||
{
|
{
|
||||||
IDP_ResizeIDPArray(prop, prop->len + 1);
|
IDP_ResizeIDPArray(prop, prop->len + 1);
|
||||||
IDP_SetIndexArray(prop, prop->len - 1, item);
|
IDP_SetIndexArray(prop, prop->len - 1, item);
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IDP_ResizeIDPArray(IDProperty *prop, int newlen)
|
void IDP_ResizeIDPArray(IDProperty *prop, int newlen)
|
||||||
|
@ -1230,7 +1230,7 @@ void BKE_imbuf_to_image_format(struct ImageFormatData *im_format, const ImBuf *i
|
|||||||
{
|
{
|
||||||
BKE_imformat_defaults(im_format);
|
BKE_imformat_defaults(im_format);
|
||||||
|
|
||||||
// file type
|
/* file type */
|
||||||
|
|
||||||
if (imbuf->ftype == IMAGIC)
|
if (imbuf->ftype == IMAGIC)
|
||||||
im_format->imtype = R_IMF_IMTYPE_IRIS;
|
im_format->imtype = R_IMF_IMTYPE_IRIS;
|
||||||
@ -1311,7 +1311,7 @@ void BKE_imbuf_to_image_format(struct ImageFormatData *im_format, const ImBuf *i
|
|||||||
im_format->quality = imbuf->ftype & ~JPG_MSK;
|
im_format->quality = imbuf->ftype & ~JPG_MSK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// planes
|
/* planes */
|
||||||
switch (imbuf->channels) {
|
switch (imbuf->channels) {
|
||||||
case 0:
|
case 0:
|
||||||
case 4: im_format->planes = R_IMF_PLANES_RGBA;
|
case 4: im_format->planes = R_IMF_PLANES_RGBA;
|
||||||
|
@ -185,7 +185,7 @@ DO_INLINE void print_lfvector(float (*fLongVector)[3], unsigned int verts)
|
|||||||
/* create long vector */
|
/* create long vector */
|
||||||
DO_INLINE lfVector *create_lfvector(unsigned int verts)
|
DO_INLINE lfVector *create_lfvector(unsigned int verts)
|
||||||
{
|
{
|
||||||
// TODO: check if memory allocation was successfull */
|
/* TODO: check if memory allocation was successfull */
|
||||||
return (lfVector *)MEM_callocN(verts * sizeof(lfVector), "cloth_implicit_alloc_vector");
|
return (lfVector *)MEM_callocN(verts * sizeof(lfVector), "cloth_implicit_alloc_vector");
|
||||||
// return (lfVector *)cloth_aligned_malloc(&MEMORY_BASE, verts * sizeof(lfVector));
|
// return (lfVector *)cloth_aligned_malloc(&MEMORY_BASE, verts * sizeof(lfVector));
|
||||||
}
|
}
|
||||||
|
@ -895,7 +895,7 @@ static char *get_rna_access(int blocktype, int adrcode, char actname[], char con
|
|||||||
/* special case for rotdiff drivers... we don't need a property for this... */
|
/* special case for rotdiff drivers... we don't need a property for this... */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// TODO... add other blocktypes...
|
/* TODO... add other blocktypes... */
|
||||||
default:
|
default:
|
||||||
printf("IPO2ANIMATO WARNING: No path for blocktype %d, adrcode %d yet\n", blocktype, adrcode);
|
printf("IPO2ANIMATO WARNING: No path for blocktype %d, adrcode %d yet\n", blocktype, adrcode);
|
||||||
break;
|
break;
|
||||||
@ -1588,9 +1588,9 @@ static void action_to_animdata(ID *id, bAction *act)
|
|||||||
|
|
||||||
/* ------------------------- */
|
/* ------------------------- */
|
||||||
|
|
||||||
// TODO:
|
/* TODO:
|
||||||
// - NLA group duplicators info
|
* - NLA group duplicators info
|
||||||
// - NLA curve/stride modifiers...
|
* - NLA curve/stride modifiers... */
|
||||||
|
|
||||||
/* Convert NLA-Strip to new system */
|
/* Convert NLA-Strip to new system */
|
||||||
static void nlastrips_to_animdata(ID *id, ListBase *strips)
|
static void nlastrips_to_animdata(ID *id, ListBase *strips)
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
#include "BKE_main.h"
|
#include "BKE_main.h"
|
||||||
#include "BKE_node.h"
|
#include "BKE_node.h"
|
||||||
|
|
||||||
void *BKE_lamp_add(const char *name)
|
Lamp *BKE_lamp_add(const char *name)
|
||||||
{
|
{
|
||||||
Lamp *la;
|
Lamp *la;
|
||||||
|
|
||||||
|
@ -1342,7 +1342,7 @@ static void lib_indirect_test_id(ID *id, Library *lib)
|
|||||||
int a;
|
int a;
|
||||||
|
|
||||||
#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
|
#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
|
||||||
// XXX old animation system! --------------------------------------
|
/* XXX old animation system! -------------------------------------- */
|
||||||
{
|
{
|
||||||
bActionStrip *strip;
|
bActionStrip *strip;
|
||||||
for (strip = ob->nlastrips.first; strip; strip = strip->next) {
|
for (strip = ob->nlastrips.first; strip; strip = strip->next) {
|
||||||
@ -1351,7 +1351,7 @@ static void lib_indirect_test_id(ID *id, Library *lib)
|
|||||||
LIBTAG(strip->ipo);
|
LIBTAG(strip->ipo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX: new animation system needs something like this?
|
/* XXX: new animation system needs something like this? */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (a = 0; a < ob->totcol; a++) {
|
for (a = 0; a < ob->totcol; a++) {
|
||||||
|
@ -1618,13 +1618,13 @@ static void decode_tfaceflag(Material *ma, int flag, int convertall)
|
|||||||
/* boolean check to see if the mesh needs a material */
|
/* boolean check to see if the mesh needs a material */
|
||||||
static int check_tfaceneedmaterial(int flag)
|
static int check_tfaceneedmaterial(int flag)
|
||||||
{
|
{
|
||||||
// check if the flags we have are not deprecated != than default material options
|
/* check if the flags we have are not deprecated != than default material options
|
||||||
// also if only flags are visible and collision see if all objects using this mesh have this option in physics
|
* also if only flags are visible and collision see if all objects using this mesh have this option in physics */
|
||||||
|
|
||||||
/* flag is shifted in 1 to make 0 != no flag yet (see encode_tfaceflag) */
|
/* flag is shifted in 1 to make 0 != no flag yet (see encode_tfaceflag) */
|
||||||
flag -= 1;
|
flag -= 1;
|
||||||
|
|
||||||
// deprecated flags
|
/* deprecated flags */
|
||||||
flag &= ~TF_OBCOL;
|
flag &= ~TF_OBCOL;
|
||||||
flag &= ~TF_SHAREDVERT;
|
flag &= ~TF_SHAREDVERT;
|
||||||
flag &= ~TF_SHAREDCOL;
|
flag &= ~TF_SHAREDCOL;
|
||||||
@ -1632,12 +1632,12 @@ static int check_tfaceneedmaterial(int flag)
|
|||||||
/* light tface flag is ignored in GLSL mode */
|
/* light tface flag is ignored in GLSL mode */
|
||||||
flag &= ~TF_LIGHT;
|
flag &= ~TF_LIGHT;
|
||||||
|
|
||||||
// automatic detected if tex image has alpha
|
/* automatic detected if tex image has alpha */
|
||||||
flag &= ~(TF_ALPHA << 15);
|
flag &= ~(TF_ALPHA << 15);
|
||||||
// automatic detected if using texture
|
/* automatic detected if using texture */
|
||||||
flag &= ~TF_TEX;
|
flag &= ~TF_TEX;
|
||||||
|
|
||||||
// settings for the default NoMaterial
|
/* settings for the default NoMaterial */
|
||||||
if (flag == TF_DYNAMIC)
|
if (flag == TF_DYNAMIC)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1646,7 +1646,7 @@ static int check_tfaceneedmaterial(int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* return number of digits of an integer */
|
/* return number of digits of an integer */
|
||||||
// XXX to be optmized or replaced by an equivalent blender internal function
|
/* XXX to be optmized or replaced by an equivalent blender internal function */
|
||||||
static int integer_getdigits(int number)
|
static int integer_getdigits(int number)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -1661,9 +1661,9 @@ static int integer_getdigits(int number)
|
|||||||
|
|
||||||
static void calculate_tface_materialname(char *matname, char *newname, int flag)
|
static void calculate_tface_materialname(char *matname, char *newname, int flag)
|
||||||
{
|
{
|
||||||
// if flag has only light and collision and material matches those values
|
/* if flag has only light and collision and material matches those values
|
||||||
// you can do strcpy(name, mat_name);
|
* you can do strcpy(name, mat_name);
|
||||||
// otherwise do:
|
* otherwise do: */
|
||||||
int digits = integer_getdigits(flag);
|
int digits = integer_getdigits(flag);
|
||||||
/* clamp the old name, remove the MA prefix and add the .TF.flag suffix
|
/* clamp the old name, remove the MA prefix and add the .TF.flag suffix
|
||||||
* e.g. matname = "MALoooooooooooooongName"; newname = "Loooooooooooooon.TF.2" */
|
* e.g. matname = "MALoooooooooooooongName"; newname = "Loooooooooooooon.TF.2" */
|
||||||
@ -1736,9 +1736,9 @@ static short convert_tfacenomaterial(Main *main, Mesh *me, MTFace *tf, int flag)
|
|||||||
set_facetexture_flags(ma, tf->tpage);
|
set_facetexture_flags(ma, tf->tpage);
|
||||||
|
|
||||||
decode_tfaceflag(ma, flag, 1);
|
decode_tfaceflag(ma, flag, 1);
|
||||||
// the final decoding will happen after, outside the main loop
|
/* the final decoding will happen after, outside the main loop
|
||||||
// for now store the flag into the material and change light/tex/collision
|
* for now store the flag into the material and change light/tex/collision
|
||||||
// store the flag as a negative number
|
* store the flag as a negative number */
|
||||||
ma->game.flag = -flag;
|
ma->game.flag = -flag;
|
||||||
id_us_min((ID *)ma);
|
id_us_min((ID *)ma);
|
||||||
}
|
}
|
||||||
|
@ -407,7 +407,7 @@ static float nlastrip_get_frame_actionclip(NlaStrip *strip, float cframe, short
|
|||||||
|
|
||||||
/* reversed = play strip backwards */
|
/* reversed = play strip backwards */
|
||||||
if (strip->flag & NLASTRIP_FLAG_REVERSE) {
|
if (strip->flag & NLASTRIP_FLAG_REVERSE) {
|
||||||
// FIXME: this won't work right with Graph Editor?
|
/* FIXME: this won't work right with Graph Editor? */
|
||||||
if (mode == NLATIME_CONVERT_MAP) {
|
if (mode == NLATIME_CONVERT_MAP) {
|
||||||
return strip->end - scale * (cframe - strip->actstart);
|
return strip->end - scale * (cframe - strip->actstart);
|
||||||
}
|
}
|
||||||
@ -1154,7 +1154,7 @@ static short nlastrip_is_first(AnimData *adt, NlaStrip *strip)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* check other tracks to see if they have a strip that's earlier */
|
/* check other tracks to see if they have a strip that's earlier */
|
||||||
// TODO: or should we check that the strip's track is also the first?
|
/* TODO: or should we check that the strip's track is also the first? */
|
||||||
for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) {
|
for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) {
|
||||||
/* only check the first strip, assuming that they're all in order */
|
/* only check the first strip, assuming that they're all in order */
|
||||||
ns = nlt->strips.first;
|
ns = nlt->strips.first;
|
||||||
@ -1234,7 +1234,7 @@ void BKE_nlastrip_validate_fcurves(NlaStrip *strip)
|
|||||||
/* store path - make copy, and store that */
|
/* store path - make copy, and store that */
|
||||||
fcu->rna_path = BLI_strdupn("influence", 9);
|
fcu->rna_path = BLI_strdupn("influence", 9);
|
||||||
|
|
||||||
// TODO: insert a few keyframes to ensure default behavior?
|
/* TODO: insert a few keyframes to ensure default behavior? */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1255,7 +1255,7 @@ void BKE_nlastrip_validate_fcurves(NlaStrip *strip)
|
|||||||
/* store path - make copy, and store that */
|
/* store path - make copy, and store that */
|
||||||
fcu->rna_path = BLI_strdupn("strip_time", 10);
|
fcu->rna_path = BLI_strdupn("strip_time", 10);
|
||||||
|
|
||||||
// TODO: insert a few keyframes to ensure default behavior?
|
/* TODO: insert a few keyframes to ensure default behavior? */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1340,7 +1340,7 @@ static void nlastrip_get_endpoint_overlaps(NlaStrip *strip, NlaTrack *track, flo
|
|||||||
/* find strips that overlap over the start/end of the given strip,
|
/* find strips that overlap over the start/end of the given strip,
|
||||||
* but which don't cover the entire length
|
* but which don't cover the entire length
|
||||||
*/
|
*/
|
||||||
// TODO: this scheme could get quite slow for doing this on many strips...
|
/* TODO: this scheme could get quite slow for doing this on many strips... */
|
||||||
for (nls = track->strips.first; nls; nls = nls->next) {
|
for (nls = track->strips.first; nls; nls = nls->next) {
|
||||||
/* check if strip overlaps (extends over or exactly on) the entire range of the strip we're validating */
|
/* check if strip overlaps (extends over or exactly on) the entire range of the strip we're validating */
|
||||||
if ((nls->start <= strip->start) && (nls->end >= strip->end)) {
|
if ((nls->start <= strip->start) && (nls->end >= strip->end)) {
|
||||||
@ -1443,7 +1443,7 @@ void BKE_nla_validate_state(AnimData *adt)
|
|||||||
/* apart from 'nothing' option which user has to explicitly choose, we don't really know if
|
/* apart from 'nothing' option which user has to explicitly choose, we don't really know if
|
||||||
* we should be overwriting the extend setting (but assume that's what the user wanted)
|
* we should be overwriting the extend setting (but assume that's what the user wanted)
|
||||||
*/
|
*/
|
||||||
// TODO: 1 solution is to tie this in with auto-blending...
|
/* TODO: 1 solution is to tie this in with auto-blending... */
|
||||||
if (strip->extendmode != NLASTRIP_EXTEND_NOTHING) {
|
if (strip->extendmode != NLASTRIP_EXTEND_NOTHING) {
|
||||||
/* 1) First strip must be set to extend hold, otherwise, stuff before acts dodgy
|
/* 1) First strip must be set to extend hold, otherwise, stuff before acts dodgy
|
||||||
* 2) Only overwrite extend mode if *not* changing it will most probably result in
|
* 2) Only overwrite extend mode if *not* changing it will most probably result in
|
||||||
@ -1469,20 +1469,20 @@ void BKE_nla_validate_state(AnimData *adt)
|
|||||||
* for normal editing only (i.e. not in editmode for some strip's action),
|
* for normal editing only (i.e. not in editmode for some strip's action),
|
||||||
* so no checks for this are performed.
|
* so no checks for this are performed.
|
||||||
*/
|
*/
|
||||||
// TODO: maybe we should have checks for this too...
|
/* TODO: maybe we should have checks for this too... */
|
||||||
void BKE_nla_action_pushdown(AnimData *adt)
|
void BKE_nla_action_pushdown(AnimData *adt)
|
||||||
{
|
{
|
||||||
NlaStrip *strip;
|
NlaStrip *strip;
|
||||||
|
|
||||||
/* sanity checks */
|
/* sanity checks */
|
||||||
// TODO: need to report the error for this
|
/* TODO: need to report the error for this */
|
||||||
if (ELEM(NULL, adt, adt->action))
|
if (ELEM(NULL, adt, adt->action))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* if the action is empty, we also shouldn't try to add to stack,
|
/* if the action is empty, we also shouldn't try to add to stack,
|
||||||
* as that will cause us grief down the track
|
* as that will cause us grief down the track
|
||||||
*/
|
*/
|
||||||
// TODO: what about modifiers?
|
/* TODO: what about modifiers? */
|
||||||
if (action_has_motion(adt->action) == 0) {
|
if (action_has_motion(adt->action) == 0) {
|
||||||
printf("BKE_nla_action_pushdown(): action has no data\n");
|
printf("BKE_nla_action_pushdown(): action has no data\n");
|
||||||
return;
|
return;
|
||||||
@ -1505,7 +1505,7 @@ void BKE_nla_action_pushdown(AnimData *adt)
|
|||||||
/* not first, so extend mode can only be NLASTRIP_EXTEND_HOLD_FORWARD not NLASTRIP_EXTEND_HOLD,
|
/* not first, so extend mode can only be NLASTRIP_EXTEND_HOLD_FORWARD not NLASTRIP_EXTEND_HOLD,
|
||||||
* so that it doesn't override strips in previous tracks
|
* so that it doesn't override strips in previous tracks
|
||||||
*/
|
*/
|
||||||
// FIXME: this needs to be more automated, since user can rearrange strips
|
/* FIXME: this needs to be more automated, since user can rearrange strips */
|
||||||
strip->extendmode = NLASTRIP_EXTEND_HOLD_FORWARD;
|
strip->extendmode = NLASTRIP_EXTEND_HOLD_FORWARD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1632,7 +1632,7 @@ void BKE_nla_tweakmode_exit(AnimData *adt)
|
|||||||
if ((adt->flag & ADT_NLA_EDIT_ON) == 0)
|
if ((adt->flag & ADT_NLA_EDIT_ON) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// TODO: need to sync the user-strip with the new state of the action!
|
/* TODO: need to sync the user-strip with the new state of the action! */
|
||||||
|
|
||||||
/* for all Tracks, clear the 'disabled' flag
|
/* for all Tracks, clear the 'disabled' flag
|
||||||
* for all Strips, clear the 'tweak-user' flag
|
* for all Strips, clear the 'tweak-user' flag
|
||||||
|
@ -223,7 +223,7 @@ void BKE_object_link_modifiers(struct Object *ob, struct Object *from)
|
|||||||
BKE_object_copy_particlesystems(ob, from);
|
BKE_object_copy_particlesystems(ob, from);
|
||||||
BKE_object_copy_softbody(ob, from);
|
BKE_object_copy_softbody(ob, from);
|
||||||
|
|
||||||
// TODO: smoke?, cloth?
|
/* TODO: smoke?, cloth? */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* here we will collect all local displist stuff */
|
/* here we will collect all local displist stuff */
|
||||||
@ -376,7 +376,7 @@ void BKE_object_unlink(Object *ob)
|
|||||||
unlink_actuators(&ob->actuators);
|
unlink_actuators(&ob->actuators);
|
||||||
|
|
||||||
/* check all objects: parents en bevels and fields, also from libraries */
|
/* check all objects: parents en bevels and fields, also from libraries */
|
||||||
// FIXME: need to check all animation blocks (drivers)
|
/* FIXME: need to check all animation blocks (drivers) */
|
||||||
obt = bmain->object.first;
|
obt = bmain->object.first;
|
||||||
while (obt) {
|
while (obt) {
|
||||||
if (obt->proxy == ob)
|
if (obt->proxy == ob)
|
||||||
@ -1376,7 +1376,7 @@ void BKE_object_make_proxy(Object *ob, Object *target, Object *gob)
|
|||||||
BKE_object_copy_proxy_drivers(ob, target);
|
BKE_object_copy_proxy_drivers(ob, target);
|
||||||
|
|
||||||
/* skip constraints? */
|
/* skip constraints? */
|
||||||
// FIXME: this is considered by many as a bug
|
/* FIXME: this is considered by many as a bug */
|
||||||
|
|
||||||
/* set object type and link to data */
|
/* set object type and link to data */
|
||||||
ob->type = target->type;
|
ob->type = target->type;
|
||||||
@ -1958,7 +1958,7 @@ static void solve_parenting(Scene *scene, Object *ob, Object *par, float obmat[]
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// total
|
/* total */
|
||||||
mul_serie_m4(tmat, totmat, ob->parentinv,
|
mul_serie_m4(tmat, totmat, ob->parentinv,
|
||||||
NULL, NULL, NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
mul_serie_m4(obmat, tmat, locmat,
|
mul_serie_m4(obmat, tmat, locmat,
|
||||||
@ -1968,10 +1968,10 @@ static void solve_parenting(Scene *scene, Object *ob, Object *par, float obmat[]
|
|||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// external usable originmat
|
/* external usable originmat */
|
||||||
copy_m3_m4(originmat, tmat);
|
copy_m3_m4(originmat, tmat);
|
||||||
|
|
||||||
// origin, voor help line
|
/* origin, for help line */
|
||||||
if ((ob->partype & PARTYPE) == PARSKEL) {
|
if ((ob->partype & PARTYPE) == PARSKEL) {
|
||||||
copy_v3_v3(ob->orig, par->obmat[3]);
|
copy_v3_v3(ob->orig, par->obmat[3]);
|
||||||
}
|
}
|
||||||
@ -1987,7 +1987,7 @@ static int where_is_object_parslow(Object *ob, float obmat[4][4], float slowmat[
|
|||||||
float fac1, fac2;
|
float fac1, fac2;
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
// include framerate
|
/* include framerate */
|
||||||
fac1 = (1.0f / (1.0f + fabsf(ob->sf)) );
|
fac1 = (1.0f / (1.0f + fabsf(ob->sf)) );
|
||||||
if (fac1 >= 1.0f) return 0;
|
if (fac1 >= 1.0f) return 0;
|
||||||
fac2 = 1.0f - fac1;
|
fac2 = 1.0f - fac1;
|
||||||
@ -2503,7 +2503,7 @@ void BKE_object_handle_update(Scene *scene, Object *ob)
|
|||||||
|
|
||||||
/* XXX new animsys warning: depsgraph tag OB_RECALC_DATA should not skip drivers,
|
/* XXX new animsys warning: depsgraph tag OB_RECALC_DATA should not skip drivers,
|
||||||
* which is only in BKE_object_where_is_calc now */
|
* which is only in BKE_object_where_is_calc now */
|
||||||
// XXX: should this case be OB_RECALC_OB instead?
|
/* XXX: should this case be OB_RECALC_OB instead? */
|
||||||
if (ob->recalc & OB_RECALC_ALL) {
|
if (ob->recalc & OB_RECALC_ALL) {
|
||||||
|
|
||||||
if (G.debug & G_DEBUG)
|
if (G.debug & G_DEBUG)
|
||||||
@ -2539,7 +2539,7 @@ void BKE_object_handle_update(Scene *scene, Object *ob)
|
|||||||
|
|
||||||
if (adt) {
|
if (adt) {
|
||||||
/* evaluate drivers - datalevel */
|
/* evaluate drivers - datalevel */
|
||||||
// XXX: for mesh types, should we push this to derivedmesh instead?
|
/* XXX: for mesh types, should we push this to derivedmesh instead? */
|
||||||
BKE_animsys_evaluate_animdata(scene, data_id, adt, ctime, ADT_RECALC_DRIVERS);
|
BKE_animsys_evaluate_animdata(scene, data_id, adt, ctime, ADT_RECALC_DRIVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3163,7 +3163,7 @@ struct LinkNode *BKE_object_relational_superset(struct Scene *scene, eObjectSet
|
|||||||
/* iterate over all selected and visible objects */
|
/* iterate over all selected and visible objects */
|
||||||
for (base = scene->base.first; base; base = base->next) {
|
for (base = scene->base.first; base; base = base->next) {
|
||||||
if (objectSet == OB_SET_ALL) {
|
if (objectSet == OB_SET_ALL) {
|
||||||
// as we get all anyways just add it
|
/* as we get all anyways just add it */
|
||||||
Object *ob = base->object;
|
Object *ob = base->object;
|
||||||
obrel_list_add(&links, ob);
|
obrel_list_add(&links, ob);
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,7 @@ int countPackedFiles(Main *bmain)
|
|||||||
bSound *sound;
|
bSound *sound;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
// let's check if there are packed files...
|
/* let's check if there are packed files... */
|
||||||
for (ima = bmain->image.first; ima; ima = ima->id.next)
|
for (ima = bmain->image.first; ima; ima = ima->id.next)
|
||||||
if (ima->packedfile)
|
if (ima->packedfile)
|
||||||
count++;
|
count++;
|
||||||
@ -181,13 +181,13 @@ PackedFile *newPackedFile(ReportList *reports, const char *filename, const char
|
|||||||
|
|
||||||
//XXX waitcursor(1);
|
//XXX waitcursor(1);
|
||||||
|
|
||||||
// convert relative filenames to absolute filenames
|
/* convert relative filenames to absolute filenames */
|
||||||
|
|
||||||
BLI_strncpy(name, filename, sizeof(name));
|
BLI_strncpy(name, filename, sizeof(name));
|
||||||
BLI_path_abs(name, basepath);
|
BLI_path_abs(name, basepath);
|
||||||
|
|
||||||
// open the file
|
/* open the file
|
||||||
// and create a PackedFile structure
|
* and create a PackedFile structure */
|
||||||
|
|
||||||
file = BLI_open(name, O_BINARY | O_RDONLY, 0);
|
file = BLI_open(name, O_BINARY | O_RDONLY, 0);
|
||||||
if (file <= 0) {
|
if (file <= 0) {
|
||||||
@ -197,8 +197,8 @@ PackedFile *newPackedFile(ReportList *reports, const char *filename, const char
|
|||||||
filelen = BLI_file_descriptor_size(file);
|
filelen = BLI_file_descriptor_size(file);
|
||||||
|
|
||||||
if (filelen == 0) {
|
if (filelen == 0) {
|
||||||
// MEM_mallocN complains about MEM_mallocN(0, "bla");
|
/* MEM_mallocN complains about MEM_mallocN(0, "bla");
|
||||||
// we don't care....
|
* we don't care.... */
|
||||||
data = MEM_mallocN(1, "packFile");
|
data = MEM_mallocN(1, "packFile");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -294,7 +294,7 @@ int writePackedFile(ReportList *reports, const char *filename, PackedFile *pf, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure the path to the file exists...
|
/* make sure the path to the file exists... */
|
||||||
BLI_make_existing_file(name);
|
BLI_make_existing_file(name);
|
||||||
|
|
||||||
file = BLI_open(name, O_BINARY + O_WRONLY + O_CREAT + O_TRUNC, 0666);
|
file = BLI_open(name, O_BINARY + O_WRONLY + O_CREAT + O_TRUNC, 0666);
|
||||||
@ -354,7 +354,7 @@ int checkPackedFile(const char *filename, PackedFile *pf)
|
|||||||
ret_val = PF_DIFFERS;
|
ret_val = PF_DIFFERS;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// we'll have to compare the two...
|
/* we'll have to compare the two... */
|
||||||
|
|
||||||
file = BLI_open(name, O_BINARY | O_RDONLY, 0);
|
file = BLI_open(name, O_BINARY | O_RDONLY, 0);
|
||||||
if (file < 0) {
|
if (file < 0) {
|
||||||
@ -370,7 +370,7 @@ int checkPackedFile(const char *filename, PackedFile *pf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (read(file, buf, len) != len) {
|
if (read(file, buf, len) != len) {
|
||||||
// read error ...
|
/* read error ... */
|
||||||
ret_val = PF_DIFFERS;
|
ret_val = PF_DIFFERS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -412,24 +412,24 @@ char *unpackFile(ReportList *reports, const char *abs_name, const char *local_na
|
|||||||
temp = abs_name;
|
temp = abs_name;
|
||||||
break;
|
break;
|
||||||
case PF_USE_LOCAL:
|
case PF_USE_LOCAL:
|
||||||
// if file exists use it
|
/* if file exists use it */
|
||||||
if (BLI_exists(local_name)) {
|
if (BLI_exists(local_name)) {
|
||||||
temp = local_name;
|
temp = local_name;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// else fall through and create it
|
/* else fall through and create it */
|
||||||
case PF_WRITE_LOCAL:
|
case PF_WRITE_LOCAL:
|
||||||
if (writePackedFile(reports, local_name, pf, 1) == RET_OK) {
|
if (writePackedFile(reports, local_name, pf, 1) == RET_OK) {
|
||||||
temp = local_name;
|
temp = local_name;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PF_USE_ORIGINAL:
|
case PF_USE_ORIGINAL:
|
||||||
// if file exists use it
|
/* if file exists use it */
|
||||||
if (BLI_exists(abs_name)) {
|
if (BLI_exists(abs_name)) {
|
||||||
temp = abs_name;
|
temp = abs_name;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// else fall through and create it
|
/* else fall through and create it */
|
||||||
case PF_WRITE_ORIGINAL:
|
case PF_WRITE_ORIGINAL:
|
||||||
if (writePackedFile(reports, abs_name, pf, 1) == RET_OK) {
|
if (writePackedFile(reports, abs_name, pf, 1) == RET_OK) {
|
||||||
temp = abs_name;
|
temp = abs_name;
|
||||||
|
@ -546,7 +546,7 @@ void psys_free(Object *ob, ParticleSystem *psys)
|
|||||||
psys->totchild = 0;
|
psys->totchild = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if we are last non-visible particle system
|
/* check if we are last non-visible particle system */
|
||||||
for (tpsys = ob->particlesystem.first; tpsys; tpsys = tpsys->next) {
|
for (tpsys = ob->particlesystem.first; tpsys; tpsys = tpsys->next) {
|
||||||
if (tpsys->part) {
|
if (tpsys->part) {
|
||||||
if (ELEM(tpsys->part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
|
if (ELEM(tpsys->part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
|
||||||
@ -555,7 +555,7 @@ void psys_free(Object *ob, ParticleSystem *psys)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// clear do-not-draw-flag
|
/* clear do-not-draw-flag */
|
||||||
if (!nr)
|
if (!nr)
|
||||||
ob->transflag &= ~OB_DUPLIPARTS;
|
ob->transflag &= ~OB_DUPLIPARTS;
|
||||||
|
|
||||||
|
@ -223,8 +223,8 @@ int compare_property(bProperty *prop, const char *str)
|
|||||||
|
|
||||||
case GPROP_FLOAT:
|
case GPROP_FLOAT:
|
||||||
case GPROP_TIME:
|
case GPROP_TIME:
|
||||||
// WARNING: untested for GPROP_TIME
|
/* WARNING: untested for GPROP_TIME
|
||||||
// function isn't used currently
|
* function isn't used currently */
|
||||||
fvalue = *((float *)&prop->data);
|
fvalue = *((float *)&prop->data);
|
||||||
ftest = (float)atof(str);
|
ftest = (float)atof(str);
|
||||||
if (fvalue > ftest) return 1;
|
if (fvalue > ftest) return 1;
|
||||||
|
@ -257,10 +257,10 @@ void BKE_scene_free(Scene *sce)
|
|||||||
/* do not free objects! */
|
/* do not free objects! */
|
||||||
|
|
||||||
if (sce->gpd) {
|
if (sce->gpd) {
|
||||||
#if 0 // removed since this can be invalid memory when freeing everything
|
#if 0 /* removed since this can be invalid memory when freeing everything */
|
||||||
// since the grease pencil data is freed before the scene.
|
/* since the grease pencil data is freed before the scene.
|
||||||
// since grease pencil data is not (yet?), shared between objects
|
* since grease pencil data is not (yet?), shared between objects
|
||||||
// its probably safe not to do this, some save and reload will free this.
|
* its probably safe not to do this, some save and reload will free this. */
|
||||||
sce->gpd->id.us--;
|
sce->gpd->id.us--;
|
||||||
#endif
|
#endif
|
||||||
sce->gpd = NULL;
|
sce->gpd = NULL;
|
||||||
@ -954,7 +954,7 @@ static void scene_update_drivers(Main *UNUSED(bmain), Scene *scene)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* world */
|
/* world */
|
||||||
// TODO: what about world textures? but then those have nodes too...
|
/* TODO: what about world textures? but then those have nodes too... */
|
||||||
if (scene->world) {
|
if (scene->world) {
|
||||||
ID *wid = (ID *)scene->world;
|
ID *wid = (ID *)scene->world;
|
||||||
AnimData *adt = BKE_animdata_from_id(wid);
|
AnimData *adt = BKE_animdata_from_id(wid);
|
||||||
@ -1060,7 +1060,7 @@ void BKE_scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
|
|||||||
sound_set_cfra(sce->r.cfra);
|
sound_set_cfra(sce->r.cfra);
|
||||||
|
|
||||||
/* clear animation overrides */
|
/* clear animation overrides */
|
||||||
// XXX TODO...
|
/* XXX TODO... */
|
||||||
|
|
||||||
for (sce_iter = sce; sce_iter; sce_iter = sce_iter->set) {
|
for (sce_iter = sce; sce_iter; sce_iter = sce_iter->set) {
|
||||||
if (sce_iter->theDag == NULL)
|
if (sce_iter->theDag == NULL)
|
||||||
|
@ -1848,7 +1848,7 @@ static void do_transform(Scene *scene, Sequence *seq, float UNUSED(facf0), int x
|
|||||||
TransformVars *transform = (TransformVars *)seq->effectdata;
|
TransformVars *transform = (TransformVars *)seq->effectdata;
|
||||||
float scale_x, scale_y, translate_x, translate_y, rotate_radians;
|
float scale_x, scale_y, translate_x, translate_y, rotate_radians;
|
||||||
|
|
||||||
// Scale
|
/* Scale */
|
||||||
if (transform->uniform_scale) {
|
if (transform->uniform_scale) {
|
||||||
scale_x = scale_y = transform->ScalexIni;
|
scale_x = scale_y = transform->ScalexIni;
|
||||||
}
|
}
|
||||||
@ -1857,7 +1857,7 @@ static void do_transform(Scene *scene, Sequence *seq, float UNUSED(facf0), int x
|
|||||||
scale_y = transform->ScaleyIni;
|
scale_y = transform->ScaleyIni;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate
|
/* Translate */
|
||||||
if (!transform->percent) {
|
if (!transform->percent) {
|
||||||
float rd_s = (scene->r.size / 100.0f);
|
float rd_s = (scene->r.size / 100.0f);
|
||||||
|
|
||||||
@ -1869,7 +1869,7 @@ static void do_transform(Scene *scene, Sequence *seq, float UNUSED(facf0), int x
|
|||||||
translate_y = y * (transform->yIni / 100.0f) + (y / 2.0f);
|
translate_y = y * (transform->yIni / 100.0f) + (y / 2.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rotate
|
/* Rotate */
|
||||||
rotate_radians = DEG2RADF(transform->rotIni);
|
rotate_radians = DEG2RADF(transform->rotIni);
|
||||||
|
|
||||||
transform_image(x, y, ibuf1, out, scale_x, scale_y, translate_x, translate_y, rotate_radians, transform->interpolation);
|
transform_image(x, y, ibuf1, out, scale_x, scale_y, translate_x, translate_y, rotate_radians, transform->interpolation);
|
||||||
|
@ -2528,7 +2528,7 @@ static ImBuf *seq_render_strip_stack(
|
|||||||
|
|
||||||
#if 0 /* commentind since this breaks keyframing, since it resets the value on draw */
|
#if 0 /* commentind since this breaks keyframing, since it resets the value on draw */
|
||||||
if (scene->r.cfra != cfra) {
|
if (scene->r.cfra != cfra) {
|
||||||
// XXX for prefetch and overlay offset!..., very bad!!!
|
/* XXX for prefetch and overlay offset!..., very bad!!! */
|
||||||
AnimData *adt = BKE_animdata_from_id(&scene->id);
|
AnimData *adt = BKE_animdata_from_id(&scene->id);
|
||||||
BKE_animsys_evaluate_animdata(scene, &scene->id, adt, cfra, ADT_RECALC_ANIM);
|
BKE_animsys_evaluate_animdata(scene, &scene->id, adt, cfra, ADT_RECALC_ANIM);
|
||||||
}
|
}
|
||||||
|
@ -120,13 +120,13 @@ void space_transform_invert(const SpaceTransform *data, float co[3])
|
|||||||
static void space_transform_apply_normal(const SpaceTransform *data, float no[3])
|
static void space_transform_apply_normal(const SpaceTransform *data, float no[3])
|
||||||
{
|
{
|
||||||
mul_mat3_m4_v3(((SpaceTransform *)data)->local2target, no);
|
mul_mat3_m4_v3(((SpaceTransform *)data)->local2target, no);
|
||||||
normalize_v3(no); // TODO: could we just determine de scale value from the matrix?
|
normalize_v3(no); /* TODO: could we just determine de scale value from the matrix? */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void space_transform_invert_normal(const SpaceTransform *data, float no[3])
|
static void space_transform_invert_normal(const SpaceTransform *data, float no[3])
|
||||||
{
|
{
|
||||||
mul_mat3_m4_v3(((SpaceTransform *)data)->target2local, no);
|
mul_mat3_m4_v3(((SpaceTransform *)data)->target2local, no);
|
||||||
normalize_v3(no); // TODO: could we just determine de scale value from the matrix?
|
normalize_v3(no); /* TODO: could we just determine de scale value from the matrix? */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -141,7 +141,7 @@ struct SmokeModifierData;
|
|||||||
|
|
||||||
/* forward declerations */
|
/* forward declerations */
|
||||||
static void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *tris, int numfaces, int numtris, int **tridivs, float cell_len);
|
static void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *tris, int numfaces, int numtris, int **tridivs, float cell_len);
|
||||||
static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, int correct);
|
static void get_cell(const float p0[3], const int res[3], float dx, const float pos[3], int cell[3], int correct);
|
||||||
static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs);
|
static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs);
|
||||||
|
|
||||||
#else /* WITH_SMOKE */
|
#else /* WITH_SMOKE */
|
||||||
@ -1977,7 +1977,7 @@ static void bresenham_linie_3D(int x1, int y1, int z1, int x2, int y2, int z2, f
|
|||||||
cb(result, input, res, pixel, tRay, correct);
|
cb(result, input, res, pixel, tRay, correct);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, int correct)
|
static void get_cell(const float p0[3], const int res[3], float dx, const float pos[3], int cell[3], int correct)
|
||||||
{
|
{
|
||||||
float tmp[3];
|
float tmp[3];
|
||||||
|
|
||||||
|
@ -1718,15 +1718,15 @@ static int choose_winner(float*w, float* pos, float*a, float*b, float*c, float*c
|
|||||||
{
|
{
|
||||||
float mindist, cp;
|
float mindist, cp;
|
||||||
int winner =1;
|
int winner =1;
|
||||||
mindist = ABS(dot_v3v3(pos, a));
|
mindist = fabsf(dot_v3v3(pos, a));
|
||||||
|
|
||||||
cp = ABS(dot_v3v3(pos, b));
|
cp = fabsf(dot_v3v3(pos, b));
|
||||||
if ( mindist < cp ) {
|
if ( mindist < cp ) {
|
||||||
mindist = cp;
|
mindist = cp;
|
||||||
winner =2;
|
winner =2;
|
||||||
}
|
}
|
||||||
|
|
||||||
cp = ABS(dot_v3v3(pos, c));
|
cp = fabsf(dot_v3v3(pos, c));
|
||||||
if (mindist < cp ) {
|
if (mindist < cp ) {
|
||||||
mindist = cp;
|
mindist = cp;
|
||||||
winner =3;
|
winner =3;
|
||||||
|
@ -1413,11 +1413,11 @@ int BKE_texture_dependsOnTime(const struct Tex *texture)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (texture->adt) {
|
else if (texture->adt) {
|
||||||
// assume anything in adt means the texture is animated
|
/* assume anything in adt means the texture is animated */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (texture->type == TEX_NOISE) {
|
else if (texture->type == TEX_NOISE) {
|
||||||
// noise always varies with time
|
/* noise always varies with time */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2315,10 +2315,10 @@ static int tracking_check_marker_margin(MovieTrackingTrack *track, MovieTracking
|
|||||||
/* margin from frame boundaries */
|
/* margin from frame boundaries */
|
||||||
BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
|
BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
|
||||||
sub_v2_v2v2(dim, pat_max, pat_min);
|
sub_v2_v2v2(dim, pat_max, pat_min);
|
||||||
margin[0] = margin[1] = MAX2(dim[0], dim[1]) / 2.0f;
|
margin[0] = margin[1] = maxf(dim[0], dim[1]) / 2.0f;
|
||||||
|
|
||||||
margin[0] = MAX2(margin[0], (float)track->margin / frame_width);
|
margin[0] = maxf(margin[0], (float)track->margin / frame_width);
|
||||||
margin[1] = MAX2(margin[1], (float)track->margin / frame_height);
|
margin[1] = maxf(margin[1], (float)track->margin / frame_height);
|
||||||
|
|
||||||
/* do not track markers which are too close to boundary */
|
/* do not track markers which are too close to boundary */
|
||||||
if (marker->pos[0] < margin[0] || marker->pos[0] > 1.0f - margin[0] ||
|
if (marker->pos[0] < margin[0] || marker->pos[0] > 1.0f - margin[0] ||
|
||||||
|
@ -516,7 +516,7 @@ static AVStream *alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex
|
|||||||
c->qmax = 51;
|
c->qmax = 51;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep lossless encodes in the RGB domain.
|
/* Keep lossless encodes in the RGB domain. */
|
||||||
if (codec_id == CODEC_ID_HUFFYUV) {
|
if (codec_id == CODEC_ID_HUFFYUV) {
|
||||||
/* HUFFYUV was PIX_FMT_YUV422P before */
|
/* HUFFYUV was PIX_FMT_YUV422P before */
|
||||||
c->pix_fmt = PIX_FMT_RGB32;
|
c->pix_fmt = PIX_FMT_RGB32;
|
||||||
@ -572,12 +572,12 @@ static AVStream *alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (codec_id == CODEC_ID_QTRLE) {
|
if (codec_id == CODEC_ID_QTRLE) {
|
||||||
// normally it should be enough to have buffer with actual image size,
|
/* normally it should be enough to have buffer with actual image size,
|
||||||
// but some codecs like QTRLE might store extra information in this buffer,
|
* but some codecs like QTRLE might store extra information in this buffer,
|
||||||
// so it should be a way larger
|
* so it should be a way larger */
|
||||||
|
|
||||||
// maximum video buffer size is 6-bytes per pixel, plus DPX header size (1664)
|
/* maximum video buffer size is 6-bytes per pixel, plus DPX header size (1664)
|
||||||
// (from FFmpeg sources)
|
* (from FFmpeg sources) */
|
||||||
int size = c->width * c->height;
|
int size = c->width * c->height;
|
||||||
video_buffersize = 7 * size + 10000;
|
video_buffersize = 7 * size + 10000;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,12 @@ extern "C" {
|
|||||||
* \param str The string to be duplicated
|
* \param str The string to be duplicated
|
||||||
* \retval Returns the duplicated string
|
* \retval Returns the duplicated string
|
||||||
*/
|
*/
|
||||||
char *BLI_strdup(const char *str);
|
char *BLI_strdup(const char *str)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Duplicates the first \a len bytes of cstring \a str
|
* Duplicates the first \a len bytes of cstring \a str
|
||||||
@ -54,7 +59,12 @@ char *BLI_strdup(const char *str);
|
|||||||
* \param len The number of bytes to duplicate
|
* \param len The number of bytes to duplicate
|
||||||
* \retval Returns the duplicated string
|
* \retval Returns the duplicated string
|
||||||
*/
|
*/
|
||||||
char *BLI_strdupn(const char *str, const size_t len);
|
char *BLI_strdupn(const char *str, const size_t len)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Appends the two strings, and returns new mallocN'ed string
|
* Appends the two strings, and returns new mallocN'ed string
|
||||||
@ -62,7 +72,12 @@ char *BLI_strdupn(const char *str, const size_t len);
|
|||||||
* \param str2 second string for append
|
* \param str2 second string for append
|
||||||
* \retval Returns dst
|
* \retval Returns dst
|
||||||
*/
|
*/
|
||||||
char *BLI_strdupcat(const char *str1, const char *str2);
|
char *BLI_strdupcat(const char *str1, const char *str2)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Like strncpy but ensures dst is always
|
* Like strncpy but ensures dst is always
|
||||||
@ -74,9 +89,14 @@ char *BLI_strdupcat(const char *str1, const char *str2);
|
|||||||
* the size of dst)
|
* the size of dst)
|
||||||
* \retval Returns dst
|
* \retval Returns dst
|
||||||
*/
|
*/
|
||||||
char *BLI_strncpy(char *dst, const char *src, const size_t maxncpy);
|
char *BLI_strncpy(char *dst, const char *src, const size_t maxncpy)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/* Makes a copy of the text within the "" that appear after some text 'blahblah'
|
/**
|
||||||
|
*Makes a copy of the text within the "" that appear after some text 'blahblah'
|
||||||
* i.e. for string 'pose["apples"]' with prefix 'pose[', it should grab "apples"
|
* i.e. for string 'pose["apples"]' with prefix 'pose[', it should grab "apples"
|
||||||
*
|
*
|
||||||
* - str: is the entire string to chop
|
* - str: is the entire string to chop
|
||||||
@ -85,7 +105,12 @@ char *BLI_strncpy(char *dst, const char *src, const size_t maxncpy);
|
|||||||
* Assume that the strings returned must be freed afterwards, and that the inputs will contain
|
* Assume that the strings returned must be freed afterwards, and that the inputs will contain
|
||||||
* data we want...
|
* data we want...
|
||||||
*/
|
*/
|
||||||
char *BLI_getQuotedStr(const char *str, const char *prefix);
|
char *BLI_getQuotedStr(const char *str, const char *prefix)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a copy of the cstring \a str into a newly mallocN'd
|
* Returns a copy of the cstring \a str into a newly mallocN'd
|
||||||
@ -97,7 +122,12 @@ char *BLI_getQuotedStr(const char *str, const char *prefix);
|
|||||||
* \param newText The text in the string to find and replace
|
* \param newText The text in the string to find and replace
|
||||||
* \retval Returns the duplicated string
|
* \retval Returns the duplicated string
|
||||||
*/
|
*/
|
||||||
char *BLI_replacestr(char *str, const char *oldText, const char *newText);
|
char *BLI_replacestr(char *str, const char *oldText, const char *newText)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Replacement for snprintf
|
* Replacement for snprintf
|
||||||
@ -105,6 +135,7 @@ char *BLI_replacestr(char *str, const char *oldText, const char *newText);
|
|||||||
size_t BLI_snprintf(char *buffer, size_t len, const char *format, ...)
|
size_t BLI_snprintf(char *buffer, size_t len, const char *format, ...)
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__attribute__ ((format(printf, 3, 4)))
|
__attribute__ ((format(printf, 3, 4)))
|
||||||
|
__attribute__((nonnull))
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -115,27 +146,75 @@ __attribute__ ((format(printf, 3, 4)))
|
|||||||
char *BLI_sprintfN(const char *format, ...)
|
char *BLI_sprintfN(const char *format, ...)
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__attribute__ ((format(printf, 1, 2)))
|
__attribute__ ((format(printf, 1, 2)))
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
size_t BLI_strescape(char *dst, const char *src, const size_t maxlen);
|
size_t BLI_strescape(char *dst, const char *src, const size_t maxlen)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare two strings without regard to case.
|
* Compare two strings without regard to case.
|
||||||
*
|
*
|
||||||
* \retval True if the strings are equal, false otherwise.
|
* \retval True if the strings are equal, false otherwise.
|
||||||
*/
|
*/
|
||||||
int BLI_strcaseeq(const char *a, const char *b);
|
int BLI_strcaseeq(const char *a, const char *b)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
char *BLI_strcasestr(const char *s, const char *find);
|
char *BLI_strcasestr(const char *s, const char *find)
|
||||||
int BLI_strcasecmp(const char *s1, const char *s2);
|
#ifdef __GNUC__
|
||||||
int BLI_strncasecmp(const char *s1, const char *s2, size_t len);
|
__attribute__((warn_unused_result))
|
||||||
int BLI_natstrcmp(const char *s1, const char *s2);
|
__attribute__((nonnull))
|
||||||
size_t BLI_strnlen(const char *str, size_t maxlen);
|
#endif
|
||||||
void BLI_timestr(double _time, char *str); /* time var is global */
|
;
|
||||||
|
int BLI_strcasecmp(const char *s1, const char *s2)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
int BLI_strncasecmp(const char *s1, const char *s2, size_t len)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
int BLI_natstrcmp(const char *s1, const char *s2)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
size_t BLI_strnlen(const char *str, size_t maxlen)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void BLI_timestr(double _time, char *str)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
; /* time var is global */
|
||||||
|
|
||||||
void BLI_ascii_strtolower(char *str, int len);
|
void BLI_ascii_strtolower(char *str, int len)
|
||||||
void BLI_ascii_strtoupper(char *str, int len);
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void BLI_ascii_strtoupper(char *str, int len)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -35,8 +35,6 @@
|
|||||||
|
|
||||||
#include "MEM_guardedalloc.h"
|
#include "MEM_guardedalloc.h"
|
||||||
|
|
||||||
// #include "BLI_blenlib.h"
|
|
||||||
|
|
||||||
#include "BLI_utildefines.h"
|
#include "BLI_utildefines.h"
|
||||||
#include "BLI_mempool.h"
|
#include "BLI_mempool.h"
|
||||||
#include "BLI_ghash.h"
|
#include "BLI_ghash.h"
|
||||||
|
@ -29,15 +29,11 @@
|
|||||||
* \ingroup bli
|
* \ingroup bli
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include "MEM_guardedalloc.h"
|
#include "MEM_guardedalloc.h"
|
||||||
|
|
||||||
#include "BLI_utildefines.h"
|
#include "BLI_utildefines.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "BLI_kdopbvh.h"
|
#include "BLI_kdopbvh.h"
|
||||||
#include "BLI_math.h"
|
#include "BLI_math.h"
|
||||||
|
|
||||||
@ -45,14 +41,12 @@
|
|||||||
#include <omp.h>
|
#include <omp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_TREETYPE 32
|
#define MAX_TREETYPE 32
|
||||||
#define DEFAULT_FIND_NEAREST_HEAP_SIZE 1024
|
#define DEFAULT_FIND_NEAREST_HEAP_SIZE 1024
|
||||||
|
|
||||||
typedef struct BVHNode {
|
typedef struct BVHNode {
|
||||||
struct BVHNode **children;
|
struct BVHNode **children;
|
||||||
struct BVHNode *parent; // some user defined traversed need that
|
struct BVHNode *parent; /* some user defined traversed need that */
|
||||||
struct BVHNode *skip[2];
|
struct BVHNode *skip[2];
|
||||||
float *bv; /* Bounding volume of all nodes, max 13 axis */
|
float *bv; /* Bounding volume of all nodes, max 13 axis */
|
||||||
int index; /* face, edge, vertex index */
|
int index; /* face, edge, vertex index */
|
||||||
@ -104,16 +98,15 @@ typedef struct BVHRayCastData {
|
|||||||
|
|
||||||
BVHTreeRayHit hit;
|
BVHTreeRayHit hit;
|
||||||
} BVHRayCastData;
|
} BVHRayCastData;
|
||||||
////////////////////////////////////////m
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
/*
|
||||||
// Bounding Volume Hierarchy Definition
|
* Bounding Volume Hierarchy Definition
|
||||||
//
|
*
|
||||||
// Notes: From OBB until 26-DOP --> all bounding volumes possible, just choose type below
|
* Notes: From OBB until 26-DOP --> all bounding volumes possible, just choose type below
|
||||||
// Notes: You have to choose the type at compile time ITM
|
* Notes: You have to choose the type at compile time ITM
|
||||||
// Notes: You can choose the tree type --> binary, quad, octree, choose below
|
* Notes: You can choose the tree type --> binary, quad, octree, choose below
|
||||||
////////////////////////////////////////////////////////////////////////
|
*/
|
||||||
|
|
||||||
static float KDOP_AXES[13][3] = {
|
static float KDOP_AXES[13][3] = {
|
||||||
{1.0, 0, 0}, {0, 1.0, 0}, {0, 0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0},
|
{1.0, 0, 0}, {0, 1.0, 0}, {0, 0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0},
|
||||||
@ -188,13 +181,15 @@ static int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, in
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
/*
|
||||||
// Introsort
|
* Introsort
|
||||||
// with permission deriven from the following Java code:
|
* with permission deriven from the following Java code:
|
||||||
// http://ralphunden.net/content/tutorials/a-guide-to-introsort/
|
* http://ralphunden.net/content/tutorials/a-guide-to-introsort/
|
||||||
// and he derived it from the SUN STL
|
* and he derived it from the SUN STL
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
*/
|
||||||
|
|
||||||
//static int size_threshold = 16;
|
//static int size_threshold = 16;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Common methods for all algorithms
|
* Common methods for all algorithms
|
||||||
*/
|
*/
|
||||||
@ -336,9 +331,9 @@ static void sort_along_axis(BVHTree *tree, int start, int end, int axis)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//after a call to this function you can expect one of:
|
/* after a call to this function you can expect one of:
|
||||||
// every node to left of a[n] are smaller or equal to it
|
* - every node to left of a[n] are smaller or equal to it
|
||||||
// every node to the right of a[n] are greater or equal to it
|
* - every node to the right of a[n] are greater or equal to it */
|
||||||
static int partition_nth_element(BVHNode **a, int _begin, int _end, int n, int axis)
|
static int partition_nth_element(BVHNode **a, int _begin, int _end, int n, int axis)
|
||||||
{
|
{
|
||||||
int begin = _begin, end = _end, cut;
|
int begin = _begin, end = _end, cut;
|
||||||
@ -354,7 +349,7 @@ static int partition_nth_element(BVHNode **a, int _begin, int _end, int n, int a
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
/* --- */
|
||||||
static void build_skip_links(BVHTree *tree, BVHNode *node, BVHNode *left, BVHNode *right)
|
static void build_skip_links(BVHTree *tree, BVHNode *node, BVHNode *left, BVHNode *right)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -381,7 +376,7 @@ static void create_kdop_hull(BVHTree *tree, BVHNode *node, const float *co, int
|
|||||||
float *bv = node->bv;
|
float *bv = node->bv;
|
||||||
int i, k;
|
int i, k;
|
||||||
|
|
||||||
// don't init boudings for the moving case
|
/* don't init boudings for the moving case */
|
||||||
if (!moving) {
|
if (!moving) {
|
||||||
for (i = tree->start_axis; i < tree->stop_axis; i++) {
|
for (i = tree->start_axis; i < tree->stop_axis; i++) {
|
||||||
bv[2 * i] = FLT_MAX;
|
bv[2 * i] = FLT_MAX;
|
||||||
@ -401,7 +396,7 @@ static void create_kdop_hull(BVHTree *tree, BVHNode *node, const float *co, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// depends on the fact that the BVH's for each face is already build
|
/* depends on the fact that the BVH's for each face is already build */
|
||||||
static void refit_kdop_hull(BVHTree *tree, BVHNode *node, int start, int end)
|
static void refit_kdop_hull(BVHTree *tree, BVHNode *node, int start, int end)
|
||||||
{
|
{
|
||||||
float newmin, newmax;
|
float newmin, newmax;
|
||||||
@ -429,31 +424,31 @@ static void refit_kdop_hull(BVHTree *tree, BVHNode *node, int start, int end)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// only supports x,y,z axis in the moment
|
/* only supports x,y,z axis in the moment
|
||||||
// but we should use a plain and simple function here for speed sake
|
* but we should use a plain and simple function here for speed sake */
|
||||||
static char get_largest_axis(float *bv)
|
static char get_largest_axis(float *bv)
|
||||||
{
|
{
|
||||||
float middle_point[3];
|
float middle_point[3];
|
||||||
|
|
||||||
middle_point[0] = (bv[1]) - (bv[0]); // x axis
|
middle_point[0] = (bv[1]) - (bv[0]); /* x axis */
|
||||||
middle_point[1] = (bv[3]) - (bv[2]); // y axis
|
middle_point[1] = (bv[3]) - (bv[2]); /* y axis */
|
||||||
middle_point[2] = (bv[5]) - (bv[4]); // z axis
|
middle_point[2] = (bv[5]) - (bv[4]); /* z axis */
|
||||||
if (middle_point[0] > middle_point[1]) {
|
if (middle_point[0] > middle_point[1]) {
|
||||||
if (middle_point[0] > middle_point[2])
|
if (middle_point[0] > middle_point[2])
|
||||||
return 1; // max x axis
|
return 1; /* max x axis */
|
||||||
else
|
else
|
||||||
return 5; // max z axis
|
return 5; /* max z axis */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (middle_point[1] > middle_point[2])
|
if (middle_point[1] > middle_point[2])
|
||||||
return 3; // max y axis
|
return 3; /* max y axis */
|
||||||
else
|
else
|
||||||
return 5; // max z axis
|
return 5; /* max z axis */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// bottom-up update of bvh node BV
|
/* bottom-up update of bvh node BV
|
||||||
// join the children on the parent BV
|
* join the children on the parent BV */
|
||||||
static void node_join(BVHTree *tree, BVHNode *node)
|
static void node_join(BVHTree *tree, BVHNode *node)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
@ -466,11 +461,11 @@ static void node_join(BVHTree *tree, BVHNode *node)
|
|||||||
for (i = 0; i < tree->tree_type; i++) {
|
for (i = 0; i < tree->tree_type; i++) {
|
||||||
if (node->children[i]) {
|
if (node->children[i]) {
|
||||||
for (j = tree->start_axis; j < tree->stop_axis; j++) {
|
for (j = tree->start_axis; j < tree->stop_axis; j++) {
|
||||||
// update minimum
|
/* update minimum */
|
||||||
if (node->children[i]->bv[(2 * j)] < node->bv[(2 * j)])
|
if (node->children[i]->bv[(2 * j)] < node->bv[(2 * j)])
|
||||||
node->bv[(2 * j)] = node->children[i]->bv[(2 * j)];
|
node->bv[(2 * j)] = node->children[i]->bv[(2 * j)];
|
||||||
|
|
||||||
// update maximum
|
/* update maximum */
|
||||||
if (node->children[i]->bv[(2 * j) + 1] > node->bv[(2 * j) + 1])
|
if (node->children[i]->bv[(2 * j) + 1] > node->bv[(2 * j) + 1])
|
||||||
node->bv[(2 * j) + 1] = node->children[i]->bv[(2 * j) + 1];
|
node->bv[(2 * j) + 1] = node->children[i]->bv[(2 * j) + 1];
|
||||||
}
|
}
|
||||||
@ -523,7 +518,7 @@ static void verify_tree(BVHTree *tree)
|
|||||||
{
|
{
|
||||||
int i, j, check = 0;
|
int i, j, check = 0;
|
||||||
|
|
||||||
// check the pointer list
|
/* check the pointer list */
|
||||||
for (i = 0; i < tree->totleaf; i++)
|
for (i = 0; i < tree->totleaf; i++)
|
||||||
{
|
{
|
||||||
if (tree->nodes[i]->parent == NULL) {
|
if (tree->nodes[i]->parent == NULL) {
|
||||||
@ -543,7 +538,7 @@ static void verify_tree(BVHTree *tree)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check the leaf list
|
/* check the leaf list */
|
||||||
for (i = 0; i < tree->totleaf; i++)
|
for (i = 0; i < tree->totleaf; i++)
|
||||||
{
|
{
|
||||||
if (tree->nodearray[i].parent == NULL) {
|
if (tree->nodearray[i].parent == NULL) {
|
||||||
@ -567,8 +562,8 @@ static void verify_tree(BVHTree *tree)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Helper data and structures to build a min-leaf generalized implicit tree
|
/* Helper data and structures to build a min-leaf generalized implicit tree
|
||||||
//This code can be easily reduced (basicly this is only method to calculate pow(k, n) in O(1).. and stuff like that)
|
* This code can be easily reduced (basicly this is only method to calculate pow(k, n) in O(1).. and stuff like that) */
|
||||||
typedef struct BVHBuildHelper {
|
typedef struct BVHBuildHelper {
|
||||||
int tree_type; /* */
|
int tree_type; /* */
|
||||||
int totleafs; /* */
|
int totleafs; /* */
|
||||||
@ -589,7 +584,7 @@ static void build_implicit_tree_helper(BVHTree *tree, BVHBuildHelper *data)
|
|||||||
data->totleafs = tree->totleaf;
|
data->totleafs = tree->totleaf;
|
||||||
data->tree_type = tree->tree_type;
|
data->tree_type = tree->tree_type;
|
||||||
|
|
||||||
//Calculate the smallest tree_type^n such that tree_type^n >= num_leafs
|
/* Calculate the smallest tree_type^n such that tree_type^n >= num_leafs */
|
||||||
for (data->leafs_per_child[0] = 1;
|
for (data->leafs_per_child[0] = 1;
|
||||||
data->leafs_per_child[0] < data->totleafs;
|
data->leafs_per_child[0] < data->totleafs;
|
||||||
data->leafs_per_child[0] *= data->tree_type)
|
data->leafs_per_child[0] *= data->tree_type)
|
||||||
@ -599,7 +594,7 @@ static void build_implicit_tree_helper(BVHTree *tree, BVHBuildHelper *data)
|
|||||||
|
|
||||||
data->branches_on_level[0] = 1;
|
data->branches_on_level[0] = 1;
|
||||||
|
|
||||||
//We could stop the loop first (but I am lazy to find out when)
|
/* We could stop the loop first (but I am lazy to find out when) */
|
||||||
for (depth = 1; depth < 32; depth++) {
|
for (depth = 1; depth < 32; depth++) {
|
||||||
data->branches_on_level[depth] = data->branches_on_level[depth - 1] * data->tree_type;
|
data->branches_on_level[depth] = data->branches_on_level[depth - 1] * data->tree_type;
|
||||||
data->leafs_per_child[depth] = data->leafs_per_child[depth - 1] / data->tree_type;
|
data->leafs_per_child[depth] = data->leafs_per_child[depth - 1] / data->tree_type;
|
||||||
@ -700,18 +695,18 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
const int tree_type = tree->tree_type;
|
const int tree_type = tree->tree_type;
|
||||||
const int tree_offset = 2 - tree->tree_type; //this value is 0 (on binary trees) and negative on the others
|
const int tree_offset = 2 - tree->tree_type; /* this value is 0 (on binary trees) and negative on the others */
|
||||||
const int num_branches = implicit_needed_branches(tree_type, num_leafs);
|
const int num_branches = implicit_needed_branches(tree_type, num_leafs);
|
||||||
|
|
||||||
BVHBuildHelper data;
|
BVHBuildHelper data;
|
||||||
int depth;
|
int depth;
|
||||||
|
|
||||||
// set parent from root node to NULL
|
/* set parent from root node to NULL */
|
||||||
BVHNode *tmp = branches_array + 0;
|
BVHNode *tmp = branches_array + 0;
|
||||||
tmp->parent = NULL;
|
tmp->parent = NULL;
|
||||||
|
|
||||||
//Most of bvhtree code relies on 1-leaf trees having at least one branch
|
/*Most of bvhtree code relies on 1-leaf trees having at least one branch
|
||||||
//We handle that special case here
|
*We handle that special case here */
|
||||||
if (num_leafs == 1) {
|
if (num_leafs == 1) {
|
||||||
BVHNode *root = branches_array + 0;
|
BVHNode *root = branches_array + 0;
|
||||||
refit_kdop_hull(tree, root, 0, num_leafs);
|
refit_kdop_hull(tree, root, 0, num_leafs);
|
||||||
@ -722,17 +717,17 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
branches_array--; //Implicit trees use 1-based indexs
|
branches_array--; /* Implicit trees use 1-based indexs */
|
||||||
|
|
||||||
build_implicit_tree_helper(tree, &data);
|
build_implicit_tree_helper(tree, &data);
|
||||||
|
|
||||||
//Loop tree levels (log N) loops
|
/* Loop tree levels (log N) loops */
|
||||||
for (i = 1, depth = 1; i <= num_branches; i = i * tree_type + tree_offset, depth++) {
|
for (i = 1, depth = 1; i <= num_branches; i = i * tree_type + tree_offset, depth++) {
|
||||||
const int first_of_next_level = i * tree_type + tree_offset;
|
const int first_of_next_level = i * tree_type + tree_offset;
|
||||||
const int end_j = MIN2(first_of_next_level, num_branches + 1); //index of last branch on this level
|
const int end_j = MIN2(first_of_next_level, num_branches + 1); /* index of last branch on this level */
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
//Loop all branches on this level
|
/* Loop all branches on this level */
|
||||||
#pragma omp parallel for private(j) schedule(static)
|
#pragma omp parallel for private(j) schedule(static)
|
||||||
for (j = i; j < end_j; j++) {
|
for (j = i; j < end_j; j++) {
|
||||||
int k;
|
int k;
|
||||||
@ -744,34 +739,34 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array,
|
|||||||
int parent_leafs_begin = implicit_leafs_index(&data, depth, parent_level_index);
|
int parent_leafs_begin = implicit_leafs_index(&data, depth, parent_level_index);
|
||||||
int parent_leafs_end = implicit_leafs_index(&data, depth, parent_level_index + 1);
|
int parent_leafs_end = implicit_leafs_index(&data, depth, parent_level_index + 1);
|
||||||
|
|
||||||
//This calculates the bounding box of this branch
|
/* This calculates the bounding box of this branch
|
||||||
//and chooses the largest axis as the axis to divide leafs
|
* and chooses the largest axis as the axis to divide leafs */
|
||||||
refit_kdop_hull(tree, parent, parent_leafs_begin, parent_leafs_end);
|
refit_kdop_hull(tree, parent, parent_leafs_begin, parent_leafs_end);
|
||||||
split_axis = get_largest_axis(parent->bv);
|
split_axis = get_largest_axis(parent->bv);
|
||||||
|
|
||||||
//Save split axis (this can be used on raytracing to speedup the query time)
|
/* Save split axis (this can be used on raytracing to speedup the query time) */
|
||||||
parent->main_axis = split_axis / 2;
|
parent->main_axis = split_axis / 2;
|
||||||
|
|
||||||
//Split the childs along the split_axis, note: its not needed to sort the whole leafs array
|
/* Split the childs along the split_axis, note: its not needed to sort the whole leafs array
|
||||||
//Only to assure that the elements are partioned on a way that each child takes the elements
|
* Only to assure that the elements are partioned on a way that each child takes the elements
|
||||||
//it would take in case the whole array was sorted.
|
* it would take in case the whole array was sorted.
|
||||||
//Split_leafs takes care of that "sort" problem.
|
* Split_leafs takes care of that "sort" problem. */
|
||||||
nth_positions[0] = parent_leafs_begin;
|
nth_positions[0] = parent_leafs_begin;
|
||||||
nth_positions[tree_type] = parent_leafs_end;
|
nth_positions[tree_type] = parent_leafs_end;
|
||||||
for (k = 1; k < tree_type; k++) {
|
for (k = 1; k < tree_type; k++) {
|
||||||
int child_index = j * tree_type + tree_offset + k;
|
int child_index = j * tree_type + tree_offset + k;
|
||||||
int child_level_index = child_index - first_of_next_level; //child level index
|
int child_level_index = child_index - first_of_next_level; /* child level index */
|
||||||
nth_positions[k] = implicit_leafs_index(&data, depth + 1, child_level_index);
|
nth_positions[k] = implicit_leafs_index(&data, depth + 1, child_level_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
split_leafs(leafs_array, nth_positions, tree_type, split_axis);
|
split_leafs(leafs_array, nth_positions, tree_type, split_axis);
|
||||||
|
|
||||||
|
|
||||||
//Setup children and totnode counters
|
/* Setup children and totnode counters
|
||||||
//Not really needed but currently most of BVH code relies on having an explicit children structure
|
* Not really needed but currently most of BVH code relies on having an explicit children structure */
|
||||||
for (k = 0; k < tree_type; k++) {
|
for (k = 0; k < tree_type; k++) {
|
||||||
int child_index = j * tree_type + tree_offset + k;
|
int child_index = j * tree_type + tree_offset + k;
|
||||||
int child_level_index = child_index - first_of_next_level; //child level index
|
int child_level_index = child_index - first_of_next_level; /* child level index */
|
||||||
|
|
||||||
int child_leafs_begin = implicit_leafs_index(&data, depth + 1, child_level_index);
|
int child_leafs_begin = implicit_leafs_index(&data, depth + 1, child_level_index);
|
||||||
int child_leafs_end = implicit_leafs_index(&data, depth + 1, child_level_index + 1);
|
int child_leafs_end = implicit_leafs_index(&data, depth + 1, child_level_index + 1);
|
||||||
@ -803,7 +798,7 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
|
|||||||
BVHTree *tree;
|
BVHTree *tree;
|
||||||
int numnodes, i;
|
int numnodes, i;
|
||||||
|
|
||||||
// theres not support for trees below binary-trees :P
|
/* theres not support for trees below binary-trees :P */
|
||||||
if (tree_type < 2)
|
if (tree_type < 2)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -812,9 +807,9 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
|
|||||||
|
|
||||||
tree = (BVHTree *)MEM_callocN(sizeof(BVHTree), "BVHTree");
|
tree = (BVHTree *)MEM_callocN(sizeof(BVHTree), "BVHTree");
|
||||||
|
|
||||||
//tree epsilon must be >= FLT_EPSILON
|
/* tree epsilon must be >= FLT_EPSILON
|
||||||
//so that tangent rays can still hit a bounding volume..
|
* so that tangent rays can still hit a bounding volume..
|
||||||
//this bug would show up when casting a ray aligned with a kdop-axis and with an edge of 2 faces
|
* this bug would show up when casting a ray aligned with a kdop-axis and with an edge of 2 faces */
|
||||||
epsilon = MAX2(FLT_EPSILON, epsilon);
|
epsilon = MAX2(FLT_EPSILON, epsilon);
|
||||||
|
|
||||||
if (tree) {
|
if (tree) {
|
||||||
@ -910,20 +905,20 @@ void BLI_bvhtree_balance(BVHTree *tree)
|
|||||||
BVHNode *branches_array = tree->nodearray + tree->totleaf;
|
BVHNode *branches_array = tree->nodearray + tree->totleaf;
|
||||||
BVHNode **leafs_array = tree->nodes;
|
BVHNode **leafs_array = tree->nodes;
|
||||||
|
|
||||||
//This function should only be called once (some big bug goes here if its being called more than once per tree)
|
/* This function should only be called once (some big bug goes here if its being called more than once per tree) */
|
||||||
assert(tree->totbranch == 0);
|
assert(tree->totbranch == 0);
|
||||||
|
|
||||||
//Build the implicit tree
|
/* Build the implicit tree */
|
||||||
non_recursive_bvh_div_nodes(tree, branches_array, leafs_array, tree->totleaf);
|
non_recursive_bvh_div_nodes(tree, branches_array, leafs_array, tree->totleaf);
|
||||||
|
|
||||||
//current code expects the branches to be linked to the nodes array
|
/*current code expects the branches to be linked to the nodes array
|
||||||
//we perform that linkage here
|
*we perform that linkage here */
|
||||||
tree->totbranch = implicit_needed_branches(tree->tree_type, tree->totleaf);
|
tree->totbranch = implicit_needed_branches(tree->tree_type, tree->totleaf);
|
||||||
for (i = 0; i < tree->totbranch; i++)
|
for (i = 0; i < tree->totbranch; i++)
|
||||||
tree->nodes[tree->totleaf + i] = branches_array + i;
|
tree->nodes[tree->totleaf + i] = branches_array + i;
|
||||||
|
|
||||||
build_skip_links(tree, tree->nodes[tree->totleaf], NULL, NULL);
|
build_skip_links(tree, tree->nodes[tree->totleaf], NULL, NULL);
|
||||||
//bvhtree_info(tree);
|
/* bvhtree_info(tree); */
|
||||||
}
|
}
|
||||||
|
|
||||||
int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints)
|
int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints)
|
||||||
@ -931,14 +926,14 @@ int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints)
|
|||||||
int i;
|
int i;
|
||||||
BVHNode *node = NULL;
|
BVHNode *node = NULL;
|
||||||
|
|
||||||
// insert should only possible as long as tree->totbranch is 0
|
/* insert should only possible as long as tree->totbranch is 0 */
|
||||||
if (tree->totbranch > 0)
|
if (tree->totbranch > 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (tree->totleaf + 1 >= MEM_allocN_len(tree->nodes) / sizeof(*(tree->nodes)))
|
if (tree->totleaf + 1 >= MEM_allocN_len(tree->nodes) / sizeof(*(tree->nodes)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// TODO check if have enough nodes in array
|
/* TODO check if have enough nodes in array */
|
||||||
|
|
||||||
node = tree->nodes[tree->totleaf] = &(tree->nodearray[tree->totleaf]);
|
node = tree->nodes[tree->totleaf] = &(tree->nodearray[tree->totleaf]);
|
||||||
tree->totleaf++;
|
tree->totleaf++;
|
||||||
@ -946,23 +941,23 @@ int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints)
|
|||||||
create_kdop_hull(tree, node, co, numpoints, 0);
|
create_kdop_hull(tree, node, co, numpoints, 0);
|
||||||
node->index = index;
|
node->index = index;
|
||||||
|
|
||||||
// inflate the bv with some epsilon
|
/* inflate the bv with some epsilon */
|
||||||
for (i = tree->start_axis; i < tree->stop_axis; i++) {
|
for (i = tree->start_axis; i < tree->stop_axis; i++) {
|
||||||
node->bv[(2 * i)] -= tree->epsilon; // minimum
|
node->bv[(2 * i)] -= tree->epsilon; /* minimum */
|
||||||
node->bv[(2 * i) + 1] += tree->epsilon; // maximum
|
node->bv[(2 * i) + 1] += tree->epsilon; /* maximum */
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// call before BLI_bvhtree_update_tree()
|
/* call before BLI_bvhtree_update_tree() */
|
||||||
int BLI_bvhtree_update_node(BVHTree *tree, int index, const float *co, const float *co_moving, int numpoints)
|
int BLI_bvhtree_update_node(BVHTree *tree, int index, const float *co, const float *co_moving, int numpoints)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
BVHNode *node = NULL;
|
BVHNode *node = NULL;
|
||||||
|
|
||||||
// check if index exists
|
/* check if index exists */
|
||||||
if (index > tree->totleaf)
|
if (index > tree->totleaf)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -982,12 +977,12 @@ int BLI_bvhtree_update_node(BVHTree *tree, int index, const float *co, const flo
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// call BLI_bvhtree_update_node() first for every node/point/triangle
|
/* call BLI_bvhtree_update_node() first for every node/point/triangle */
|
||||||
void BLI_bvhtree_update_tree(BVHTree *tree)
|
void BLI_bvhtree_update_tree(BVHTree *tree)
|
||||||
{
|
{
|
||||||
//Update bottom=>top
|
/* Update bottom=>top
|
||||||
//TRICKY: the way we build the tree all the childs have an index greater than the parent
|
* TRICKY: the way we build the tree all the childs have an index greater than the parent
|
||||||
//This allows us todo a bottom up update by starting on the biger numbered branch
|
* This allows us todo a bottom up update by starting on the biger numbered branch */
|
||||||
|
|
||||||
BVHNode **root = tree->nodes + tree->totleaf;
|
BVHNode **root = tree->nodes + tree->totleaf;
|
||||||
BVHNode **index = tree->nodes + tree->totleaf + tree->totbranch - 1;
|
BVHNode **index = tree->nodes + tree->totleaf + tree->totbranch - 1;
|
||||||
@ -1004,8 +999,8 @@ float BLI_bvhtree_getepsilon(BVHTree *tree)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* BLI_bvhtree_overlap
|
* BLI_bvhtree_overlap
|
||||||
*/
|
*
|
||||||
// overlap - is it possbile for 2 bv's to collide ?
|
* overlap - is it possbile for 2 bv's to collide ? */
|
||||||
static int tree_overlap(BVHNode *node1, BVHNode *node2, int start_axis, int stop_axis)
|
static int tree_overlap(BVHNode *node1, BVHNode *node2, int start_axis, int stop_axis)
|
||||||
{
|
{
|
||||||
float *bv1 = node1->bv;
|
float *bv1 = node1->bv;
|
||||||
@ -1016,7 +1011,7 @@ static int tree_overlap(BVHNode *node1, BVHNode *node2, int start_axis, int stop
|
|||||||
bv1 += start_axis << 1;
|
bv1 += start_axis << 1;
|
||||||
bv2 += start_axis << 1;
|
bv2 += start_axis << 1;
|
||||||
|
|
||||||
// test all axis if min + max overlap
|
/* test all axis if min + max overlap */
|
||||||
for (; bv1 != bv1_end; bv1 += 2, bv2 += 2) {
|
for (; bv1 != bv1_end; bv1 += 2, bv2 += 2) {
|
||||||
if ((*(bv1) > *(bv2 + 1)) || (*(bv2) > *(bv1 + 1)))
|
if ((*(bv1) > *(bv2 + 1)) || (*(bv2) > *(bv1 + 1)))
|
||||||
return 0;
|
return 0;
|
||||||
@ -1030,9 +1025,9 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2)
|
|||||||
int j;
|
int j;
|
||||||
|
|
||||||
if (tree_overlap(node1, node2, data->start_axis, data->stop_axis)) {
|
if (tree_overlap(node1, node2, data->start_axis, data->stop_axis)) {
|
||||||
// check if node1 is a leaf
|
/* check if node1 is a leaf */
|
||||||
if (!node1->totnode) {
|
if (!node1->totnode) {
|
||||||
// check if node2 is a leaf
|
/* check if node2 is a leaf */
|
||||||
if (!node2->totnode) {
|
if (!node2->totnode) {
|
||||||
|
|
||||||
if (node1 == node2) {
|
if (node1 == node2) {
|
||||||
@ -1040,7 +1035,7 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data->i >= data->max_overlap) {
|
if (data->i >= data->max_overlap) {
|
||||||
// try to make alloc'ed memory bigger
|
/* try to make alloc'ed memory bigger */
|
||||||
data->overlap = realloc(data->overlap, sizeof(BVHTreeOverlap) * data->max_overlap * 2);
|
data->overlap = realloc(data->overlap, sizeof(BVHTreeOverlap) * data->max_overlap * 2);
|
||||||
|
|
||||||
if (!data->overlap) {
|
if (!data->overlap) {
|
||||||
@ -1222,14 +1217,14 @@ PUSH_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size)
|
|||||||
static void NodeDistance_pop_heap(NodeDistance *heap, int heap_size)
|
static void NodeDistance_pop_heap(NodeDistance *heap, int heap_size)
|
||||||
POP_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size)
|
POP_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size)
|
||||||
|
|
||||||
//NN function that uses an heap.. this functions leads to an optimal number of min-distance
|
/* NN function that uses an heap.. this functions leads to an optimal number of min-distance
|
||||||
//but for normal tri-faces and BV 6-dop.. a simple dfs with local heuristics (as implemented
|
* but for normal tri-faces and BV 6-dop.. a simple dfs with local heuristics (as implemented
|
||||||
//in source/blender/blenkernel/intern/shrinkwrap.c) works faster.
|
* in source/blender/blenkernel/intern/shrinkwrap.c) works faster.
|
||||||
//
|
*
|
||||||
//It may make sense to use this function if the callback queries are very slow.. or if its impossible
|
* It may make sense to use this function if the callback queries are very slow.. or if its impossible
|
||||||
//to get a nice heuristic
|
* to get a nice heuristic
|
||||||
//
|
*
|
||||||
//this function uses "malloc/free" instead of the MEM_* because it intends to be openmp safe
|
* this function uses "malloc/free" instead of the MEM_* because it intends to be openmp safe */
|
||||||
static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
|
static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -1327,11 +1322,11 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float co[3], BVHTreeNearest *n
|
|||||||
data.nearest.dist = FLT_MAX;
|
data.nearest.dist = FLT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
//dfs search
|
/* dfs search */
|
||||||
if (root)
|
if (root)
|
||||||
dfs_find_nearest_begin(&data, root);
|
dfs_find_nearest_begin(&data, root);
|
||||||
|
|
||||||
//copy back results
|
/* copy back results */
|
||||||
if (nearest) {
|
if (nearest) {
|
||||||
memcpy(nearest, &data.nearest, sizeof(*nearest));
|
memcpy(nearest, &data.nearest, sizeof(*nearest));
|
||||||
}
|
}
|
||||||
@ -1347,7 +1342,7 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float co[3], BVHTreeNearest *n
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//Determines the distance that the ray must travel to hit the bounding volume of the given node
|
/* Determines the distance that the ray must travel to hit the bounding volume of the given node */
|
||||||
static float ray_nearest_hit(BVHRayCastData *data, float *bv)
|
static float ray_nearest_hit(BVHRayCastData *data, float *bv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -1382,11 +1377,11 @@ static float ray_nearest_hit(BVHRayCastData *data, float *bv)
|
|||||||
return low;
|
return low;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Determines the distance that the ray must travel to hit the bounding volume of the given node
|
/* Determines the distance that the ray must travel to hit the bounding volume of the given node
|
||||||
//Based on Tactical Optimization of Ray/Box Intersection, by Graham Fyffe
|
* Based on Tactical Optimization of Ray/Box Intersection, by Graham Fyffe
|
||||||
//[http://tog.acm.org/resources/RTNews/html/rtnv21n1.html#art9]
|
* [http://tog.acm.org/resources/RTNews/html/rtnv21n1.html#art9]
|
||||||
//
|
*
|
||||||
//TODO this doens't has data->ray.radius in consideration
|
* TODO this doens't has data->ray.radius in consideration */
|
||||||
static float fast_ray_nearest_hit(const BVHRayCastData *data, const BVHNode *node)
|
static float fast_ray_nearest_hit(const BVHRayCastData *data, const BVHNode *node)
|
||||||
{
|
{
|
||||||
const float *bv = node->bv;
|
const float *bv = node->bv;
|
||||||
@ -1413,8 +1408,8 @@ static void dfs_raycast(BVHRayCastData *data, BVHNode *node)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
//ray-bv is really fast.. and simple tests revealed its worth to test it
|
/* ray-bv is really fast.. and simple tests revealed its worth to test it
|
||||||
//before calling the ray-primitive functions
|
* before calling the ray-primitive functions */
|
||||||
/* XXX: temporary solution for particles until fast_ray_nearest_hit supports ray.radius */
|
/* XXX: temporary solution for particles until fast_ray_nearest_hit supports ray.radius */
|
||||||
float dist = (data->ray.radius > 0.0f) ? ray_nearest_hit(data, node->bv) : fast_ray_nearest_hit(data, node);
|
float dist = (data->ray.radius > 0.0f) ? ray_nearest_hit(data, node->bv) : fast_ray_nearest_hit(data, node);
|
||||||
if (dist >= data->hit.dist) return;
|
if (dist >= data->hit.dist) return;
|
||||||
@ -1430,7 +1425,7 @@ static void dfs_raycast(BVHRayCastData *data, BVHNode *node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//pick loop direction to dive into the tree (based on ray direction and split axis)
|
/* pick loop direction to dive into the tree (based on ray direction and split axis) */
|
||||||
if (data->ray_dot_axis[(int)node->main_axis] > 0.0f) {
|
if (data->ray_dot_axis[(int)node->main_axis] > 0.0f) {
|
||||||
for (i = 0; i != node->totnode; i++) {
|
for (i = 0; i != node->totnode; i++) {
|
||||||
dfs_raycast(data, node->children[i]);
|
dfs_raycast(data, node->children[i]);
|
||||||
|
@ -136,7 +136,7 @@ DLRBT_Node *BLI_dlrbTree_search(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, vo
|
|||||||
short found = 0;
|
short found = 0;
|
||||||
|
|
||||||
/* check that there is a comparator to use */
|
/* check that there is a comparator to use */
|
||||||
// TODO: if no comparator is supplied, try using the one supplied with the tree...
|
/* TODO: if no comparator is supplied, try using the one supplied with the tree... */
|
||||||
if (cmp_cb == NULL)
|
if (cmp_cb == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ DLRBT_Node *BLI_dlrbTree_search_exact(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_
|
|||||||
short found = 0;
|
short found = 0;
|
||||||
|
|
||||||
/* check that there is a comparator to use */
|
/* check that there is a comparator to use */
|
||||||
// TODO: if no comparator is supplied, try using the one supplied with the tree...
|
/* TODO: if no comparator is supplied, try using the one supplied with the tree... */
|
||||||
if (cmp_cb == NULL)
|
if (cmp_cb == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ DLRBT_Node *BLI_dlrbTree_search_prev(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_c
|
|||||||
DLRBT_Node *node;
|
DLRBT_Node *node;
|
||||||
|
|
||||||
/* check that there is a comparator to use */
|
/* check that there is a comparator to use */
|
||||||
// TODO: if no comparator is supplied, try using the one supplied with the tree...
|
/* TODO: if no comparator is supplied, try using the one supplied with the tree... */
|
||||||
if (cmp_cb == NULL)
|
if (cmp_cb == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -230,7 +230,7 @@ DLRBT_Node *BLI_dlrbTree_search_prev(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_c
|
|||||||
return node;
|
return node;
|
||||||
|
|
||||||
/* return the previous node otherwise */
|
/* return the previous node otherwise */
|
||||||
// NOTE: what happens if there is no previous node?
|
/* NOTE: what happens if there is no previous node? */
|
||||||
return node->prev;
|
return node->prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ DLRBT_Node *BLI_dlrbTree_search_next(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_c
|
|||||||
DLRBT_Node *node;
|
DLRBT_Node *node;
|
||||||
|
|
||||||
/* check that there is a comparator to use */
|
/* check that there is a comparator to use */
|
||||||
// TODO: if no comparator is supplied, try using the one supplied with the tree...
|
/* TODO: if no comparator is supplied, try using the one supplied with the tree... */
|
||||||
if (cmp_cb == NULL)
|
if (cmp_cb == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -257,7 +257,7 @@ DLRBT_Node *BLI_dlrbTree_search_next(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_c
|
|||||||
return node;
|
return node;
|
||||||
|
|
||||||
/* return the previous node otherwise */
|
/* return the previous node otherwise */
|
||||||
// NOTE: what happens if there is no previous node?
|
/* NOTE: what happens if there is no previous node? */
|
||||||
return node->next;
|
return node->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,13 +513,13 @@ DLRBT_Node *BLI_dlrbTree_add(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb,
|
|||||||
if (tree == NULL)
|
if (tree == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// TODO: if no comparator is supplied, try using the one supplied with the tree...
|
/* TODO: if no comparator is supplied, try using the one supplied with the tree... */
|
||||||
if (cmp_cb == NULL)
|
if (cmp_cb == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
// TODO: if no allocator is supplied, try using the one supplied with the tree...
|
/* TODO: if no allocator is supplied, try using the one supplied with the tree... */
|
||||||
if (new_cb == NULL)
|
if (new_cb == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
// TODO: if no updater is supplied, try using the one supplied with the tree...
|
/* TODO: if no updater is supplied, try using the one supplied with the tree... */
|
||||||
|
|
||||||
/* try to find the nearest node to this one */
|
/* try to find the nearest node to this one */
|
||||||
parNode = BLI_dlrbTree_search(tree, cmp_cb, data);
|
parNode = BLI_dlrbTree_search(tree, cmp_cb, data);
|
||||||
@ -586,6 +586,6 @@ DLRBT_Node *BLI_dlrbTree_add(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb,
|
|||||||
/* *********************************************** */
|
/* *********************************************** */
|
||||||
/* Remove */
|
/* Remove */
|
||||||
|
|
||||||
// TODO: this hasn't been coded yet, since this functionality was not needed by the author
|
/* TODO: this hasn't been coded yet, since this functionality was not needed by the author */
|
||||||
|
|
||||||
/* *********************************************** */
|
/* *********************************************** */
|
||||||
|
@ -274,12 +274,12 @@ int BLI_move(const char *file, const char *to)
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
// windows doesn't support moveing to a directory
|
/* windows doesn't support moveing to a directory
|
||||||
// it has to be 'mv filename filename' and not
|
* it has to be 'mv filename filename' and not
|
||||||
// 'mv filename destdir'
|
* 'mv filename destdir' */
|
||||||
|
|
||||||
BLI_strncpy(str, to, sizeof(str));
|
BLI_strncpy(str, to, sizeof(str));
|
||||||
// points 'to' to a directory ?
|
/* points 'to' to a directory ? */
|
||||||
if (BLI_last_slash(str) == (str + strlen(str) - 1)) {
|
if (BLI_last_slash(str) == (str + strlen(str) - 1)) {
|
||||||
if (BLI_last_slash(file) != NULL) {
|
if (BLI_last_slash(file) != NULL) {
|
||||||
strcat(str, BLI_last_slash(file) + 1);
|
strcat(str, BLI_last_slash(file) + 1);
|
||||||
@ -305,12 +305,12 @@ int BLI_copy(const char *file, const char *to)
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
// windows doesn't support copying to a directory
|
/* windows doesn't support copying to a directory
|
||||||
// it has to be 'cp filename filename' and not
|
* it has to be 'cp filename filename' and not
|
||||||
// 'cp filename destdir'
|
* 'cp filename destdir' */
|
||||||
|
|
||||||
BLI_strncpy(str, to, sizeof(str));
|
BLI_strncpy(str, to, sizeof(str));
|
||||||
// points 'to' to a directory ?
|
/* points 'to' to a directory ? */
|
||||||
if (BLI_last_slash(str) == (str + strlen(str) - 1)) {
|
if (BLI_last_slash(str) == (str + strlen(str) - 1)) {
|
||||||
if (BLI_last_slash(file) != NULL) {
|
if (BLI_last_slash(file) != NULL) {
|
||||||
strcat(str, BLI_last_slash(file) + 1);
|
strcat(str, BLI_last_slash(file) + 1);
|
||||||
|
@ -71,12 +71,12 @@ static FT_Error err;
|
|||||||
|
|
||||||
static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vfd)
|
static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vfd)
|
||||||
{
|
{
|
||||||
// Blender
|
/* Blender */
|
||||||
struct Nurb *nu;
|
struct Nurb *nu;
|
||||||
struct VChar *che;
|
struct VChar *che;
|
||||||
struct BezTriple *bezt;
|
struct BezTriple *bezt;
|
||||||
|
|
||||||
// Freetype2
|
/* Freetype2 */
|
||||||
FT_GlyphSlot glyph;
|
FT_GlyphSlot glyph;
|
||||||
FT_UInt glyph_index;
|
FT_UInt glyph_index;
|
||||||
FT_Outline ftoutline;
|
FT_Outline ftoutline;
|
||||||
@ -84,42 +84,42 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
float dx, dy;
|
float dx, dy;
|
||||||
int j, k, l, m = 0;
|
int j, k, l, m = 0;
|
||||||
|
|
||||||
// adjust font size
|
/* adjust font size */
|
||||||
height = ((double) face->bbox.yMax - (double) face->bbox.yMin);
|
height = ((double) face->bbox.yMax - (double) face->bbox.yMin);
|
||||||
if (height != 0.0f)
|
if (height != 0.0f)
|
||||||
scale = 1.0f / height;
|
scale = 1.0f / height;
|
||||||
else
|
else
|
||||||
scale = 1.0f / 1000.0f;
|
scale = 1.0f / 1000.0f;
|
||||||
|
|
||||||
//
|
/*
|
||||||
// Generate the character 3D data
|
* Generate the character 3D data
|
||||||
//
|
*
|
||||||
// Get the FT Glyph index and load the Glyph
|
* Get the FT Glyph index and load the Glyph */
|
||||||
glyph_index = FT_Get_Char_Index(face, charcode);
|
glyph_index = FT_Get_Char_Index(face, charcode);
|
||||||
err = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP);
|
err = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP);
|
||||||
|
|
||||||
// If loading succeeded, convert the FT glyph to the internal format
|
/* If loading succeeded, convert the FT glyph to the internal format */
|
||||||
if (!err) {
|
if (!err) {
|
||||||
int *npoints;
|
int *npoints;
|
||||||
int *onpoints;
|
int *onpoints;
|
||||||
|
|
||||||
// First we create entry for the new character to the character list
|
/* First we create entry for the new character to the character list */
|
||||||
che = (VChar *) MEM_callocN(sizeof(struct VChar), "objfnt_char");
|
che = (VChar *) MEM_callocN(sizeof(struct VChar), "objfnt_char");
|
||||||
BLI_addtail(&vfd->characters, che);
|
BLI_addtail(&vfd->characters, che);
|
||||||
|
|
||||||
// Take some data for modifying purposes
|
/* Take some data for modifying purposes */
|
||||||
glyph = face->glyph;
|
glyph = face->glyph;
|
||||||
ftoutline = glyph->outline;
|
ftoutline = glyph->outline;
|
||||||
|
|
||||||
// Set the width and character code
|
/* Set the width and character code */
|
||||||
che->index = charcode;
|
che->index = charcode;
|
||||||
che->width = glyph->advance.x * scale;
|
che->width = glyph->advance.x * scale;
|
||||||
|
|
||||||
// Start converting the FT data
|
/* Start converting the FT data */
|
||||||
npoints = (int *)MEM_callocN((ftoutline.n_contours) * sizeof(int), "endpoints");
|
npoints = (int *)MEM_callocN((ftoutline.n_contours) * sizeof(int), "endpoints");
|
||||||
onpoints = (int *)MEM_callocN((ftoutline.n_contours) * sizeof(int), "onpoints");
|
onpoints = (int *)MEM_callocN((ftoutline.n_contours) * sizeof(int), "onpoints");
|
||||||
|
|
||||||
// calculate total points of each contour
|
/* calculate total points of each contour */
|
||||||
for (j = 0; j < ftoutline.n_contours; j++) {
|
for (j = 0; j < ftoutline.n_contours; j++) {
|
||||||
if (j == 0)
|
if (j == 0)
|
||||||
npoints[j] = ftoutline.contours[j] + 1;
|
npoints[j] = ftoutline.contours[j] + 1;
|
||||||
@ -127,7 +127,7 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
npoints[j] = ftoutline.contours[j] - ftoutline.contours[j - 1];
|
npoints[j] = ftoutline.contours[j] - ftoutline.contours[j - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
// get number of on-curve points for beziertriples (including conic virtual on-points)
|
/* get number of on-curve points for beziertriples (including conic virtual on-points) */
|
||||||
for (j = 0; j < ftoutline.n_contours; j++) {
|
for (j = 0; j < ftoutline.n_contours; j++) {
|
||||||
for (k = 0; k < npoints[j]; k++) {
|
for (k = 0; k < npoints[j]; k++) {
|
||||||
l = (j > 0) ? (k + ftoutline.contours[j - 1] + 1) : k;
|
l = (j > 0) ? (k + ftoutline.contours[j - 1] + 1) : k;
|
||||||
@ -145,9 +145,9 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//contour loop, bezier & conic styles merged
|
/* contour loop, bezier & conic styles merged */
|
||||||
for (j = 0; j < ftoutline.n_contours; j++) {
|
for (j = 0; j < ftoutline.n_contours; j++) {
|
||||||
// add new curve
|
/* add new curve */
|
||||||
nu = (Nurb *)MEM_callocN(sizeof(struct Nurb), "objfnt_nurb");
|
nu = (Nurb *)MEM_callocN(sizeof(struct Nurb), "objfnt_nurb");
|
||||||
bezt = (BezTriple *)MEM_callocN((onpoints[j]) * sizeof(BezTriple), "objfnt_bezt");
|
bezt = (BezTriple *)MEM_callocN((onpoints[j]) * sizeof(BezTriple), "objfnt_bezt");
|
||||||
BLI_addtail(&che->nurbsbase, nu);
|
BLI_addtail(&che->nurbsbase, nu);
|
||||||
@ -159,26 +159,26 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
nu->flagu = CU_NURB_CYCLIC;
|
nu->flagu = CU_NURB_CYCLIC;
|
||||||
nu->bezt = bezt;
|
nu->bezt = bezt;
|
||||||
|
|
||||||
//individual curve loop, start-end
|
/* individual curve loop, start-end */
|
||||||
for (k = 0; k < npoints[j]; k++) {
|
for (k = 0; k < npoints[j]; k++) {
|
||||||
if (j > 0) l = k + ftoutline.contours[j - 1] + 1; else l = k;
|
if (j > 0) l = k + ftoutline.contours[j - 1] + 1; else l = k;
|
||||||
if (k == 0) m = l;
|
if (k == 0) m = l;
|
||||||
|
|
||||||
//virtual conic on-curve points
|
/* virtual conic on-curve points */
|
||||||
if (k < npoints[j] - 1) {
|
if (k < npoints[j] - 1) {
|
||||||
if (ftoutline.tags[l] == FT_Curve_Tag_Conic && ftoutline.tags[l + 1] == FT_Curve_Tag_Conic) {
|
if (ftoutline.tags[l] == FT_Curve_Tag_Conic && ftoutline.tags[l + 1] == FT_Curve_Tag_Conic) {
|
||||||
dx = (ftoutline.points[l].x + ftoutline.points[l + 1].x) * scale / 2.0f;
|
dx = (ftoutline.points[l].x + ftoutline.points[l + 1].x) * scale / 2.0f;
|
||||||
dy = (ftoutline.points[l].y + ftoutline.points[l + 1].y) * scale / 2.0f;
|
dy = (ftoutline.points[l].y + ftoutline.points[l + 1].y) * scale / 2.0f;
|
||||||
|
|
||||||
//left handle
|
/* left handle */
|
||||||
bezt->vec[0][0] = (dx + (2 * ftoutline.points[l].x) * scale) / 3.0f;
|
bezt->vec[0][0] = (dx + (2 * ftoutline.points[l].x) * scale) / 3.0f;
|
||||||
bezt->vec[0][1] = (dy + (2 * ftoutline.points[l].y) * scale) / 3.0f;
|
bezt->vec[0][1] = (dy + (2 * ftoutline.points[l].y) * scale) / 3.0f;
|
||||||
|
|
||||||
//midpoint (virtual on-curve point)
|
/* midpoint (virtual on-curve point) */
|
||||||
bezt->vec[1][0] = dx;
|
bezt->vec[1][0] = dx;
|
||||||
bezt->vec[1][1] = dy;
|
bezt->vec[1][1] = dy;
|
||||||
|
|
||||||
//right handle
|
/* right handle */
|
||||||
bezt->vec[2][0] = (dx + (2 * ftoutline.points[l + 1].x) * scale) / 3.0f;
|
bezt->vec[2][0] = (dx + (2 * ftoutline.points[l + 1].x) * scale) / 3.0f;
|
||||||
bezt->vec[2][1] = (dy + (2 * ftoutline.points[l + 1].y) * scale) / 3.0f;
|
bezt->vec[2][1] = (dy + (2 * ftoutline.points[l + 1].y) * scale) / 3.0f;
|
||||||
|
|
||||||
@ -188,9 +188,9 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//on-curve points
|
/* on-curve points */
|
||||||
if (ftoutline.tags[l] == FT_Curve_Tag_On) {
|
if (ftoutline.tags[l] == FT_Curve_Tag_On) {
|
||||||
//left handle
|
/* left handle */
|
||||||
if (k > 0) {
|
if (k > 0) {
|
||||||
if (ftoutline.tags[l - 1] == FT_Curve_Tag_Cubic) {
|
if (ftoutline.tags[l - 1] == FT_Curve_Tag_Cubic) {
|
||||||
bezt->vec[0][0] = ftoutline.points[l - 1].x * scale;
|
bezt->vec[0][0] = ftoutline.points[l - 1].x * scale;
|
||||||
@ -208,7 +208,7 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
bezt->h1 = HD_VECT;
|
bezt->h1 = HD_VECT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { //first point on curve
|
else { /* first point on curve */
|
||||||
if (ftoutline.tags[ftoutline.contours[j]] == FT_Curve_Tag_Cubic) {
|
if (ftoutline.tags[ftoutline.contours[j]] == FT_Curve_Tag_Cubic) {
|
||||||
bezt->vec[0][0] = ftoutline.points[ftoutline.contours[j]].x * scale;
|
bezt->vec[0][0] = ftoutline.points[ftoutline.contours[j]].x * scale;
|
||||||
bezt->vec[0][1] = ftoutline.points[ftoutline.contours[j]].y * scale;
|
bezt->vec[0][1] = ftoutline.points[ftoutline.contours[j]].y * scale;
|
||||||
@ -226,11 +226,11 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//midpoint (on-curve point)
|
/* midpoint (on-curve point) */
|
||||||
bezt->vec[1][0] = ftoutline.points[l].x * scale;
|
bezt->vec[1][0] = ftoutline.points[l].x * scale;
|
||||||
bezt->vec[1][1] = ftoutline.points[l].y * scale;
|
bezt->vec[1][1] = ftoutline.points[l].y * scale;
|
||||||
|
|
||||||
//right handle
|
/* right handle */
|
||||||
if (k < (npoints[j] - 1)) {
|
if (k < (npoints[j] - 1)) {
|
||||||
if (ftoutline.tags[l + 1] == FT_Curve_Tag_Cubic) {
|
if (ftoutline.tags[l + 1] == FT_Curve_Tag_Cubic) {
|
||||||
bezt->vec[2][0] = ftoutline.points[l + 1].x * scale;
|
bezt->vec[2][0] = ftoutline.points[l + 1].x * scale;
|
||||||
@ -248,7 +248,7 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
bezt->h2 = HD_VECT;
|
bezt->h2 = HD_VECT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { //last point on curve
|
else { /* last point on curve */
|
||||||
if (ftoutline.tags[m] == FT_Curve_Tag_Cubic) {
|
if (ftoutline.tags[m] == FT_Curve_Tag_Cubic) {
|
||||||
bezt->vec[2][0] = ftoutline.points[m].x * scale;
|
bezt->vec[2][0] = ftoutline.points[m].x * scale;
|
||||||
bezt->vec[2][1] = ftoutline.points[m].y * scale;
|
bezt->vec[2][1] = ftoutline.points[m].y * scale;
|
||||||
@ -266,17 +266,19 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the handles that are aligned, tricky...
|
/* get the handles that are aligned, tricky...
|
||||||
// dist_to_line_v2, check if the three beztriple points are on one line
|
* dist_to_line_v2, check if the three beztriple points are on one line
|
||||||
// len_squared_v2v2, see if there's a distance between the three points
|
* len_squared_v2v2, see if there's a distance between the three points
|
||||||
// len_squared_v2v2 again, to check the angle between the handles
|
* len_squared_v2v2 again, to check the angle between the handles
|
||||||
// finally, check if one of them is a vector handle
|
* finally, check if one of them is a vector handle */
|
||||||
if ((dist_to_line_v2(bezt->vec[0], bezt->vec[1], bezt->vec[2]) < 0.001f) &&
|
if ((bezt->h1 != HD_VECT && bezt->h2 != HD_VECT) &&
|
||||||
|
(dist_to_line_v2(bezt->vec[0], bezt->vec[1], bezt->vec[2]) < 0.001f) &&
|
||||||
(len_squared_v2v2(bezt->vec[0], bezt->vec[1]) > 0.0001f * 0.0001f) &&
|
(len_squared_v2v2(bezt->vec[0], bezt->vec[1]) > 0.0001f * 0.0001f) &&
|
||||||
(len_squared_v2v2(bezt->vec[1], bezt->vec[2]) > 0.0001f * 0.0001f) &&
|
(len_squared_v2v2(bezt->vec[1], bezt->vec[2]) > 0.0001f * 0.0001f) &&
|
||||||
(len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > 0.0002f * 0.0001f) &&
|
(len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > 0.0002f * 0.0001f) &&
|
||||||
(len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > MAX2(len_squared_v2v2(bezt->vec[0], bezt->vec[1]), len_squared_v2v2(bezt->vec[1], bezt->vec[2]))) &&
|
(len_squared_v2v2(bezt->vec[0], bezt->vec[2]) >
|
||||||
bezt->h1 != HD_VECT && bezt->h2 != HD_VECT)
|
maxf(len_squared_v2v2(bezt->vec[0], bezt->vec[1]),
|
||||||
|
len_squared_v2v2(bezt->vec[1], bezt->vec[2]))))
|
||||||
{
|
{
|
||||||
bezt->h1 = bezt->h2 = HD_ALIGN;
|
bezt->h1 = bezt->h2 = HD_ALIGN;
|
||||||
}
|
}
|
||||||
@ -292,17 +294,17 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
|
|||||||
|
|
||||||
static int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode)
|
static int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode)
|
||||||
{
|
{
|
||||||
// Freetype2
|
/* Freetype2 */
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
struct TmpFont *tf;
|
struct TmpFont *tf;
|
||||||
|
|
||||||
// Find the correct FreeType font
|
/* Find the correct FreeType font */
|
||||||
tf = BKE_vfont_find_tmpfont(vfont);
|
tf = BKE_vfont_find_tmpfont(vfont);
|
||||||
|
|
||||||
// What, no font found. Something strange here
|
/* What, no font found. Something strange here */
|
||||||
if (!tf) return FALSE;
|
if (!tf) return FALSE;
|
||||||
|
|
||||||
// Load the font to memory
|
/* Load the font to memory */
|
||||||
if (tf->pf) {
|
if (tf->pf) {
|
||||||
err = FT_New_Memory_Face(library,
|
err = FT_New_Memory_Face(library,
|
||||||
tf->pf->data,
|
tf->pf->data,
|
||||||
@ -316,17 +318,17 @@ static int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the char
|
/* Read the char */
|
||||||
freetypechar_to_vchar(face, charcode, vfont->data);
|
freetypechar_to_vchar(face, charcode, vfont->data);
|
||||||
|
|
||||||
// And everything went ok
|
/* And everything went ok */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
|
static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
|
||||||
{
|
{
|
||||||
// Variables
|
/* Variables */
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
FT_ULong charcode = 0, lcode;
|
FT_ULong charcode = 0, lcode;
|
||||||
FT_UInt glyph_index;
|
FT_UInt glyph_index;
|
||||||
@ -341,7 +343,7 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
|
|||||||
int n;
|
int n;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// load the freetype font
|
/* load the freetype font */
|
||||||
err = FT_New_Memory_Face(library,
|
err = FT_New_Memory_Face(library,
|
||||||
pf->data,
|
pf->data,
|
||||||
pf->size,
|
pf->size,
|
||||||
@ -364,22 +366,22 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
|
|||||||
|
|
||||||
if (!found) { return NULL; }
|
if (!found) { return NULL; }
|
||||||
|
|
||||||
// now, select the charmap for the face object
|
/* now, select the charmap for the face object */
|
||||||
err = FT_Set_Charmap(face, found);
|
err = FT_Set_Charmap(face, found);
|
||||||
if (err) { return NULL; }
|
if (err) { return NULL; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// allocate blender font
|
/* allocate blender font */
|
||||||
vfd = MEM_callocN(sizeof(*vfd), "FTVFontData");
|
vfd = MEM_callocN(sizeof(*vfd), "FTVFontData");
|
||||||
|
|
||||||
// get the name
|
/* get the name */
|
||||||
fontname = FT_Get_Postscript_Name(face);
|
fontname = FT_Get_Postscript_Name(face);
|
||||||
BLI_strncpy(vfd->name, (fontname == NULL) ? "" : fontname, sizeof(vfd->name));
|
BLI_strncpy(vfd->name, (fontname == NULL) ? "" : fontname, sizeof(vfd->name));
|
||||||
|
|
||||||
// Extract the first 256 character from TTF
|
/* Extract the first 256 character from TTF */
|
||||||
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
|
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
|
||||||
|
|
||||||
// No charmap found from the ttf so we need to figure it out
|
/* No charmap found from the ttf so we need to figure it out */
|
||||||
if (glyph_index == 0) {
|
if (glyph_index == 0) {
|
||||||
FT_CharMap found = NULL;
|
FT_CharMap found = NULL;
|
||||||
FT_CharMap charmap;
|
FT_CharMap charmap;
|
||||||
@ -401,15 +403,15 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
|
|||||||
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
|
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load characters
|
/* Load characters */
|
||||||
while (charcode < 256) {
|
while (charcode < 256) {
|
||||||
// Generate the font data
|
/* Generate the font data */
|
||||||
freetypechar_to_vchar(face, charcode, vfd);
|
freetypechar_to_vchar(face, charcode, vfd);
|
||||||
|
|
||||||
// Next glyph
|
/* Next glyph */
|
||||||
charcode = FT_Get_Next_Char(face, charcode, &glyph_index);
|
charcode = FT_Get_Next_Char(face, charcode, &glyph_index);
|
||||||
|
|
||||||
// Check that we won't start infinite loop
|
/* Check that we won't start infinite loop */
|
||||||
if (charcode <= lcode)
|
if (charcode <= lcode)
|
||||||
break;
|
break;
|
||||||
lcode = charcode;
|
lcode = charcode;
|
||||||
@ -455,7 +457,7 @@ static int check_freetypefont(PackedFile *pf)
|
|||||||
|
|
||||||
if (!found) { return 0; }
|
if (!found) { return 0; }
|
||||||
|
|
||||||
// now, select the charmap for the face object
|
/* now, select the charmap for the face object */
|
||||||
err = FT_Set_Charmap(face, found);
|
err = FT_Set_Charmap(face, found);
|
||||||
if (err) { return 0; }
|
if (err) { return 0; }
|
||||||
#endif
|
#endif
|
||||||
@ -509,21 +511,21 @@ int BLI_vfontchar_from_freetypefont(VFont *vfont, unsigned long character)
|
|||||||
|
|
||||||
if (!vfont) return FALSE;
|
if (!vfont) return FALSE;
|
||||||
|
|
||||||
// Init Freetype
|
/* Init Freetype */
|
||||||
err = FT_Init_FreeType(&library);
|
err = FT_Init_FreeType(&library);
|
||||||
if (err) {
|
if (err) {
|
||||||
//XXX error("Failed to load the Freetype font library");
|
/* XXX error("Failed to load the Freetype font library"); */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the character
|
/* Load the character */
|
||||||
success = objchr_to_ftvfontdata(vfont, character);
|
success = objchr_to_ftvfontdata(vfont, character);
|
||||||
if (success == FALSE) return FALSE;
|
if (success == FALSE) return FALSE;
|
||||||
|
|
||||||
// Free Freetype
|
/* Free Freetype */
|
||||||
FT_Done_FreeType(library);
|
FT_Done_FreeType(library);
|
||||||
|
|
||||||
// Ahh everything ok
|
/* Ahh everything ok */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,29 +554,29 @@ static short IsectLLPt2Df(const float x0, const float y0, const float x1, const
|
|||||||
* compute slopes, note the cludge for infinity, however, this will
|
* compute slopes, note the cludge for infinity, however, this will
|
||||||
* be close enough
|
* be close enough
|
||||||
*/
|
*/
|
||||||
if (fabs(x1 - x0) > 0.000001)
|
if (fabs(x1 - x0) > 0.000001f)
|
||||||
m1 = (y1 - y0) / (x1 - x0);
|
m1 = (y1 - y0) / (x1 - x0);
|
||||||
else
|
else
|
||||||
return -1; /*m1 = (float)1e+10;*/ // close enough to infinity
|
return -1; /*m1 = (float)1e+10;*/ /* close enough to infinity */
|
||||||
|
|
||||||
if (fabs(x3 - x2) > 0.000001)
|
if (fabs(x3 - x2) > 0.000001f)
|
||||||
m2 = (y3 - y2) / (x3 - x2);
|
m2 = (y3 - y2) / (x3 - x2);
|
||||||
else
|
else
|
||||||
return -1; /*m2 = (float)1e+10;*/ // close enough to infinity
|
return -1; /*m2 = (float)1e+10;*/ /* close enough to infinity */
|
||||||
|
|
||||||
if (fabs(m1 - m2) < 0.000001)
|
if (fabs(m1 - m2) < 0.000001f)
|
||||||
return -1; /* parallel lines */
|
return -1; /* parallel lines */
|
||||||
|
|
||||||
// compute constants
|
/* compute constants */
|
||||||
|
|
||||||
c1 = (y0 - m1 * x0);
|
c1 = (y0 - m1 * x0);
|
||||||
c2 = (y2 - m2 * x2);
|
c2 = (y2 - m2 * x2);
|
||||||
|
|
||||||
// compute the inverse of the determinate
|
/* compute the inverse of the determinate */
|
||||||
|
|
||||||
det_inv = 1.0f / (-m1 + m2);
|
det_inv = 1.0f / (-m1 + m2);
|
||||||
|
|
||||||
// use Kramers rule to compute xi and yi
|
/* use Kramers rule to compute xi and yi */
|
||||||
|
|
||||||
*xi = ((-c2 + c1) * det_inv);
|
*xi = ((-c2 + c1) * det_inv);
|
||||||
*yi = ((m2 * c1 - m1 * c2) * det_inv);
|
*yi = ((m2 * c1 - m1 * c2) * det_inv);
|
||||||
@ -1123,15 +1123,17 @@ int isect_axial_line_tri_v3(const int axis, const float p1[3], const float p2[3]
|
|||||||
float u, v, f;
|
float u, v, f;
|
||||||
int a0 = axis, a1 = (axis + 1) % 3, a2 = (axis + 2) % 3;
|
int a0 = axis, a1 = (axis + 1) % 3, a2 = (axis + 2) % 3;
|
||||||
|
|
||||||
//return isect_line_tri_v3(p1,p2,v0,v1,v2,lambda);
|
#if 0
|
||||||
|
return isect_line_tri_v3(p1,p2,v0,v1,v2,lambda);
|
||||||
|
|
||||||
///* first a simple bounding box test */
|
/* first a simple bounding box test */
|
||||||
//if (MIN3(v0[a1],v1[a1],v2[a1]) > p1[a1]) return 0;
|
if (MIN3(v0[a1],v1[a1],v2[a1]) > p1[a1]) return 0;
|
||||||
//if (MIN3(v0[a2],v1[a2],v2[a2]) > p1[a2]) return 0;
|
if (MIN3(v0[a2],v1[a2],v2[a2]) > p1[a2]) return 0;
|
||||||
//if (MAX3(v0[a1],v1[a1],v2[a1]) < p1[a1]) return 0;
|
if (MAX3(v0[a1],v1[a1],v2[a1]) < p1[a1]) return 0;
|
||||||
//if (MAX3(v0[a2],v1[a2],v2[a2]) < p1[a2]) return 0;
|
if (MAX3(v0[a2],v1[a2],v2[a2]) < p1[a2]) return 0;
|
||||||
|
|
||||||
///* then a full intersection test */
|
/* then a full intersection test */
|
||||||
|
#endif
|
||||||
|
|
||||||
sub_v3_v3v3(e1, v1, v0);
|
sub_v3_v3v3(e1, v1, v0);
|
||||||
sub_v3_v3v3(e2, v2, v0);
|
sub_v3_v3v3(e2, v2, v0);
|
||||||
@ -1331,8 +1333,8 @@ int isect_ray_aabb(const IsectRayAABBData *data, const float bb_min[3],
|
|||||||
if (tzmin > tmin)
|
if (tzmin > tmin)
|
||||||
tmin = tzmin;
|
tmin = tzmin;
|
||||||
|
|
||||||
// XXX jwilkins: tmax does not need to be updated since we don't use it
|
/* XXX jwilkins: tmax does not need to be updated since we don't use it
|
||||||
// keeping this here for future reference
|
* keeping this here for future reference */
|
||||||
//if (tzmax < tmax) tmax = tzmax;
|
//if (tzmax < tmax) tmax = tzmax;
|
||||||
|
|
||||||
if (tmin_out)
|
if (tmin_out)
|
||||||
@ -2803,21 +2805,21 @@ static int ff_visible_quad(const float p[3], const float n[3],
|
|||||||
if (sd[0] > 0) {
|
if (sd[0] > 0) {
|
||||||
if (sd[1] > 0) {
|
if (sd[1] > 0) {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// +++
|
/* +++ */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// ++-
|
/* ++- */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
||||||
vec_add_dir(q3, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
vec_add_dir(q3, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// ++0
|
/* ++0 */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
@ -2826,21 +2828,21 @@ static int ff_visible_quad(const float p[3], const float n[3],
|
|||||||
}
|
}
|
||||||
else if (sd[1] < 0) {
|
else if (sd[1] < 0) {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// +-+
|
/* +-+ */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
vec_add_dir(q1, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
vec_add_dir(q1, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
||||||
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
||||||
copy_v3_v3(q3, v2);
|
copy_v3_v3(q3, v2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// +--
|
/* +-- */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
vec_add_dir(q1, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
vec_add_dir(q1, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
||||||
vec_add_dir(q2, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
vec_add_dir(q2, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// +-0
|
/* +-0 */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
vec_add_dir(q1, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
vec_add_dir(q1, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
@ -2849,21 +2851,21 @@ static int ff_visible_quad(const float p[3], const float n[3],
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// +0+
|
/* +0+ */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// +0-
|
/* +0- */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
vec_add_dir(q2, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
vec_add_dir(q2, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// +00
|
/* +00 */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
@ -2874,21 +2876,21 @@ static int ff_visible_quad(const float p[3], const float n[3],
|
|||||||
else if (sd[0] < 0) {
|
else if (sd[0] < 0) {
|
||||||
if (sd[1] > 0) {
|
if (sd[1] > 0) {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// -++
|
/* -++ */
|
||||||
vec_add_dir(q0, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
vec_add_dir(q0, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
vec_add_dir(q3, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
vec_add_dir(q3, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// -+-
|
/* -+- */
|
||||||
vec_add_dir(q0, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
vec_add_dir(q0, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// -+0
|
/* -+0 */
|
||||||
vec_add_dir(q0, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
vec_add_dir(q0, v0, v1, (sd[0] / (sd[0] - sd[1])));
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
@ -2897,35 +2899,35 @@ static int ff_visible_quad(const float p[3], const float n[3],
|
|||||||
}
|
}
|
||||||
else if (sd[1] < 0) {
|
else if (sd[1] < 0) {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// --+
|
/* --+ */
|
||||||
vec_add_dir(q0, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
vec_add_dir(q0, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
||||||
vec_add_dir(q1, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
vec_add_dir(q1, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// ---
|
/* --- */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// --0
|
/* --0 */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// -0+
|
/* -0+ */
|
||||||
vec_add_dir(q0, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
vec_add_dir(q0, v0, v2, (sd[0] / (sd[0] - sd[2])));
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// -0-
|
/* -0- */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// -00
|
/* -00 */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2933,21 +2935,21 @@ static int ff_visible_quad(const float p[3], const float n[3],
|
|||||||
else {
|
else {
|
||||||
if (sd[1] > 0) {
|
if (sd[1] > 0) {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// 0++
|
/* 0++ */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// 0+-
|
/* 0+- */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
vec_add_dir(q2, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 0+0
|
/* 0+0 */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
@ -2956,35 +2958,35 @@ static int ff_visible_quad(const float p[3], const float n[3],
|
|||||||
}
|
}
|
||||||
else if (sd[1] < 0) {
|
else if (sd[1] < 0) {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// 0-+
|
/* 0-+ */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
vec_add_dir(q1, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
vec_add_dir(q1, v1, v2, (sd[1] / (sd[1] - sd[2])));
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// 0--
|
/* 0-- */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 0-0
|
/* 0-0 */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (sd[2] > 0) {
|
if (sd[2] > 0) {
|
||||||
// 00+
|
/* 00+ */
|
||||||
copy_v3_v3(q0, v0);
|
copy_v3_v3(q0, v0);
|
||||||
copy_v3_v3(q1, v1);
|
copy_v3_v3(q1, v1);
|
||||||
copy_v3_v3(q2, v2);
|
copy_v3_v3(q2, v2);
|
||||||
copy_v3_v3(q3, q2);
|
copy_v3_v3(q3, q2);
|
||||||
}
|
}
|
||||||
else if (sd[2] < 0) {
|
else if (sd[2] < 0) {
|
||||||
// 00-
|
/* 00- */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 000
|
/* 000 */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1271,7 +1271,7 @@ int is_negative_m4(float mat[][4])
|
|||||||
|
|
||||||
/* make a 4x4 matrix out of 3 transform components */
|
/* make a 4x4 matrix out of 3 transform components */
|
||||||
/* matrices are made in the order: scale * rot * loc */
|
/* matrices are made in the order: scale * rot * loc */
|
||||||
// TODO: need to have a version that allows for rotation order...
|
/* TODO: need to have a version that allows for rotation order... */
|
||||||
|
|
||||||
void loc_eul_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3])
|
void loc_eul_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3])
|
||||||
{
|
{
|
||||||
|
@ -1199,12 +1199,12 @@ typedef struct RotOrderInfo {
|
|||||||
*/
|
*/
|
||||||
static RotOrderInfo rotOrders[] = {
|
static RotOrderInfo rotOrders[] = {
|
||||||
/* i, j, k, n */
|
/* i, j, k, n */
|
||||||
{{0, 1, 2}, 0}, // XYZ
|
{{0, 1, 2}, 0}, /* XYZ */
|
||||||
{{0, 2, 1}, 1}, // XZY
|
{{0, 2, 1}, 1}, /* XZY */
|
||||||
{{1, 0, 2}, 1}, // YXZ
|
{{1, 0, 2}, 1}, /* YXZ */
|
||||||
{{1, 2, 0}, 0}, // YZX
|
{{1, 2, 0}, 0}, /* YZX */
|
||||||
{{2, 0, 1}, 0}, // ZXY
|
{{2, 0, 1}, 0}, /* ZXY */
|
||||||
{{2, 1, 0}, 1} // ZYX
|
{{2, 1, 0}, 1} /* ZYX */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Get relevant pointer to rotation order set from the array
|
/* Get relevant pointer to rotation order set from the array
|
||||||
|
@ -282,8 +282,8 @@ static float npfade(float t)
|
|||||||
|
|
||||||
static float grad(int hash, float x, float y, float z)
|
static float grad(int hash, float x, float y, float z)
|
||||||
{
|
{
|
||||||
int h = hash & 15; // CONVERT LO 4 BITS OF HASH CODE
|
int h = hash & 15; /* CONVERT LO 4 BITS OF HASH CODE */
|
||||||
float u = h < 8 ? x : y, // INTO 12 GRADIENT DIRECTIONS.
|
float u = h < 8 ? x : y, /* INTO 12 GRADIENT DIRECTIONS. */
|
||||||
v = h < 4 ? y : h == 12 || h == 14 ? x : z;
|
v = h < 4 ? y : h == 12 || h == 14 ? x : z;
|
||||||
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
|
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
|
||||||
}
|
}
|
||||||
@ -293,21 +293,21 @@ static float newPerlin(float x, float y, float z)
|
|||||||
{
|
{
|
||||||
int A, AA, AB, B, BA, BB;
|
int A, AA, AB, B, BA, BB;
|
||||||
float u = floor(x), v = floor(y), w = floor(z);
|
float u = floor(x), v = floor(y), w = floor(z);
|
||||||
int X = ((int)u) & 255, Y = ((int)v) & 255, Z = ((int)w) & 255; // FIND UNIT CUBE THAT CONTAINS POINT
|
int X = ((int)u) & 255, Y = ((int)v) & 255, Z = ((int)w) & 255; /* FIND UNIT CUBE THAT CONTAINS POINT */
|
||||||
x -= u; // FIND RELATIVE X,Y,Z
|
x -= u; /* FIND RELATIVE X,Y,Z */
|
||||||
y -= v; // OF POINT IN CUBE.
|
y -= v; /* OF POINT IN CUBE. */
|
||||||
z -= w;
|
z -= w;
|
||||||
u = npfade(x); // COMPUTE FADE CURVES
|
u = npfade(x); /* COMPUTE FADE CURVES */
|
||||||
v = npfade(y); // FOR EACH OF X,Y,Z.
|
v = npfade(y); /* FOR EACH OF X,Y,Z. */
|
||||||
w = npfade(z);
|
w = npfade(z);
|
||||||
A = hash[X ]+Y; AA = hash[A]+Z; AB = hash[A+1]+Z; // HASH COORDINATES OF
|
A = hash[X ]+Y; AA = hash[A]+Z; AB = hash[A+1]+Z; /* HASH COORDINATES OF */
|
||||||
B = hash[X+1]+Y; BA = hash[B]+Z; BB = hash[B+1]+Z; // THE 8 CUBE CORNERS,
|
B = hash[X+1]+Y; BA = hash[B]+Z; BB = hash[B+1]+Z; /* THE 8 CUBE CORNERS, */
|
||||||
return lerp(w, lerp(v, lerp(u, grad(hash[AA ], x, y, z ), // AND ADD
|
return lerp(w, lerp(v, lerp(u, grad(hash[AA ], x, y, z ), /* AND ADD */
|
||||||
grad(hash[BA ], x - 1, y, z )), // BLENDED
|
grad(hash[BA ], x - 1, y, z )), /* BLENDED */
|
||||||
lerp(u, grad(hash[AB ], x, y - 1, z ), // RESULTS
|
lerp(u, grad(hash[AB ], x, y - 1, z ), /* RESULTS */
|
||||||
grad(hash[BB ], x - 1, y - 1, z ))), // FROM 8
|
grad(hash[BB ], x - 1, y - 1, z ))), /* FROM 8 */
|
||||||
lerp(v, lerp(u, grad(hash[AA + 1], x, y, z - 1), // CORNERS
|
lerp(v, lerp(u, grad(hash[AA + 1], x, y, z - 1), /* CORNERS */
|
||||||
grad(hash[BA + 1], x - 1, y, z - 1)), // OF CUBE
|
grad(hash[BA + 1], x - 1, y, z - 1)), /* OF CUBE */
|
||||||
lerp(u, grad(hash[AB + 1], x, y - 1, z - 1),
|
lerp(u, grad(hash[AB + 1], x, y - 1, z - 1),
|
||||||
grad(hash[BB + 1], x - 1, y - 1, z - 1))));
|
grad(hash[BB + 1], x - 1, y - 1, z - 1))));
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ char *BLI_getQuotedStr(const char *str, const char *prefix)
|
|||||||
startMatch = strstr(str, prefix) + prefixLen + 1;
|
startMatch = strstr(str, prefix) + prefixLen + 1;
|
||||||
|
|
||||||
/* get the end point (i.e. where the next occurance of " is after the starting point) */
|
/* get the end point (i.e. where the next occurance of " is after the starting point) */
|
||||||
endMatch = strchr(startMatch, '"'); // " NOTE: this comment here is just so that my text editor still shows the functions ok...
|
endMatch = strchr(startMatch, '"'); /* " NOTE: this comment here is just so that my text editor still shows the functions ok... */
|
||||||
|
|
||||||
/* return the slice indicated */
|
/* return the slice indicated */
|
||||||
return BLI_strdupn(startMatch, (size_t)(endMatch - startMatch));
|
return BLI_strdupn(startMatch, (size_t)(endMatch - startMatch));
|
||||||
@ -187,8 +187,9 @@ char *BLI_getQuotedStr(const char *str, const char *prefix)
|
|||||||
/* Replaces all occurrences of oldText with newText in str, returning a new string that doesn't
|
/* Replaces all occurrences of oldText with newText in str, returning a new string that doesn't
|
||||||
* contain the 'replaced' occurrences.
|
* contain the 'replaced' occurrences.
|
||||||
*/
|
*/
|
||||||
// A rather wasteful string-replacement utility, though this shall do for now...
|
|
||||||
// Feel free to replace this with an even safe + nicer alternative
|
/* A rather wasteful string-replacement utility, though this shall do for now...
|
||||||
|
* Feel free to replace this with an even safe + nicer alternative */
|
||||||
char *BLI_replacestr(char *str, const char *oldText, const char *newText)
|
char *BLI_replacestr(char *str, const char *oldText, const char *newText)
|
||||||
{
|
{
|
||||||
DynStr *ds = NULL;
|
DynStr *ds = NULL;
|
||||||
|
@ -56,15 +56,18 @@ float BLI_voxel_sample_nearest(float *data, const int res[3], const float co[3])
|
|||||||
return D(data, res, xi, yi, zi);
|
return D(data, res, xi, yi, zi);
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns highest integer <= x as integer (slightly faster than floor())
|
/* returns highest integer <= x as integer (slightly faster than floor()) */
|
||||||
BLI_INLINE int FLOORI(float x)
|
BLI_INLINE int FLOORI(float x)
|
||||||
{
|
{
|
||||||
const int r = (int)x;
|
const int r = (int)x;
|
||||||
return ((x >= 0.f) || (float)r == x) ? r : (r - 1);
|
return ((x >= 0.f) || (float)r == x) ? r : (r - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// clamp function, cannot use the CLAMPIS macro, it sometimes returns unwanted results apparently related to gcc optimization flag -fstrict-overflow which is enabled at -O2
|
/* clamp function, cannot use the CLAMPIS macro, it sometimes returns unwanted results apparently related to
|
||||||
// this causes the test (x + 2) < 0 with int x == 2147483647 to return false (x being an integer, x + 2 should wrap around to -2147483647 so the test < 0 should return true, which it doesn't)
|
* gcc optimization flag -fstrict-overflow which is enabled at -O2
|
||||||
|
*
|
||||||
|
* this causes the test (x + 2) < 0 with int x == 2147483647 to return false (x being an integer,
|
||||||
|
* x + 2 should wrap around to -2147483647 so the test < 0 should return true, which it doesn't) */
|
||||||
BLI_INLINE int _clamp(int a, int b, int c)
|
BLI_INLINE int _clamp(int a, int b, int c)
|
||||||
{
|
{
|
||||||
return (a < b) ? b : ((a > c) ? c : a);
|
return (a < b) ? b : ((a > c) ? c : a);
|
||||||
|
@ -98,10 +98,10 @@ void RegisterBlendExtension(void)
|
|||||||
printf("Registering file extension...");
|
printf("Registering file extension...");
|
||||||
GetModuleFileName(0, BlPath, MAX_PATH);
|
GetModuleFileName(0, BlPath, MAX_PATH);
|
||||||
|
|
||||||
// root is HKLM by default
|
/* root is HKLM by default */
|
||||||
lresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
|
lresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
|
||||||
if (lresult != ERROR_SUCCESS) {
|
if (lresult != ERROR_SUCCESS) {
|
||||||
// try HKCU on failure
|
/* try HKCU on failure */
|
||||||
usr_mode = TRUE;
|
usr_mode = TRUE;
|
||||||
lresult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
|
lresult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
|
||||||
if (lresult != ERROR_SUCCESS)
|
if (lresult != ERROR_SUCCESS)
|
||||||
|
@ -99,11 +99,11 @@
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_smooth_vert_def = {
|
static BMOpDefine bmo_smooth_vert_def = {
|
||||||
"smooth_vert",
|
"smooth_vert",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, //input vertices
|
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, /* input vertices */
|
||||||
{BMO_OP_SLOT_BOOL, "mirror_clip_x"}, //set vertices close to the x axis before the operation to 0
|
{BMO_OP_SLOT_BOOL, "mirror_clip_x"}, /* set vertices close to the x axis before the operation to 0 */
|
||||||
{BMO_OP_SLOT_BOOL, "mirror_clip_y"}, //set vertices close to the y axis before the operation to 0
|
{BMO_OP_SLOT_BOOL, "mirror_clip_y"}, /* set vertices close to the y axis before the operation to 0 */
|
||||||
{BMO_OP_SLOT_BOOL, "mirror_clip_z"}, //set vertices close to the z axis before the operation to 0
|
{BMO_OP_SLOT_BOOL, "mirror_clip_z"}, /* set vertices close to the z axis before the operation to 0 */
|
||||||
{BMO_OP_SLOT_FLT, "clipdist"}, //clipping threshod for the above three slots
|
{BMO_OP_SLOT_FLT, "clipdist"}, /* clipping threshod for the above three slots */
|
||||||
{0} /* null-terminating sentinel */,
|
{0} /* null-terminating sentinel */,
|
||||||
},
|
},
|
||||||
bmo_smooth_vert_exec,
|
bmo_smooth_vert_exec,
|
||||||
@ -119,7 +119,7 @@ static BMOpDefine bmo_smooth_vert_def = {
|
|||||||
static BMOpDefine bmo_recalc_face_normals_def = {
|
static BMOpDefine bmo_recalc_face_normals_def = {
|
||||||
"recalc_face_normals",
|
"recalc_face_normals",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "faces"},
|
{{BMO_OP_SLOT_ELEMENT_BUF, "faces"},
|
||||||
{BMO_OP_SLOT_BOOL, "do_flip"}, //internal flag, used by bmesh_rationalize_normals
|
{BMO_OP_SLOT_BOOL, "do_flip"}, /* internal flag, used by bmesh_rationalize_normals */
|
||||||
{0} /* null-terminating sentinel */,
|
{0} /* null-terminating sentinel */,
|
||||||
},
|
},
|
||||||
bmo_recalc_face_normals_exec,
|
bmo_recalc_face_normals_exec,
|
||||||
@ -138,10 +138,10 @@ static BMOpDefine bmo_recalc_face_normals_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_region_extend_def = {
|
static BMOpDefine bmo_region_extend_def = {
|
||||||
"region_extend",
|
"region_extend",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "geom"}, //input geometry
|
{{BMO_OP_SLOT_ELEMENT_BUF, "geom"}, /* input geometry */
|
||||||
{BMO_OP_SLOT_ELEMENT_BUF, "geomout"}, //output slot, computed boundary geometry.
|
{BMO_OP_SLOT_ELEMENT_BUF, "geomout"}, /* output slot, computed boundary geometry. */
|
||||||
{BMO_OP_SLOT_BOOL, "constrict"}, //find boundary inside the regions, not outside.
|
{BMO_OP_SLOT_BOOL, "constrict"}, /* find boundary inside the regions, not outside. */
|
||||||
{BMO_OP_SLOT_BOOL, "use_faces"}, //extend from faces instead of edges
|
{BMO_OP_SLOT_BOOL, "use_faces"}, /* extend from faces instead of edges */
|
||||||
{0} /* null-terminating sentinel */,
|
{0} /* null-terminating sentinel */,
|
||||||
},
|
},
|
||||||
bmo_region_extend_exec,
|
bmo_region_extend_exec,
|
||||||
@ -156,9 +156,9 @@ static BMOpDefine bmo_region_extend_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_rotate_edges_def = {
|
static BMOpDefine bmo_rotate_edges_def = {
|
||||||
"rotate_edges",
|
"rotate_edges",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "edges"}, //input edges
|
{{BMO_OP_SLOT_ELEMENT_BUF, "edges"}, /* input edges */
|
||||||
{BMO_OP_SLOT_ELEMENT_BUF, "edgeout"}, //newly spun edges
|
{BMO_OP_SLOT_ELEMENT_BUF, "edgeout"}, /* newly spun edges */
|
||||||
{BMO_OP_SLOT_BOOL, "ccw"}, //rotate edge counter-clockwise if true, othewise clockwise
|
{BMO_OP_SLOT_BOOL, "ccw"}, /* rotate edge counter-clockwise if true, othewise clockwise */
|
||||||
{0} /* null-terminating sentinel */,
|
{0} /* null-terminating sentinel */,
|
||||||
},
|
},
|
||||||
bmo_rotate_edges_exec,
|
bmo_rotate_edges_exec,
|
||||||
@ -173,7 +173,7 @@ static BMOpDefine bmo_rotate_edges_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_reverse_faces_def = {
|
static BMOpDefine bmo_reverse_faces_def = {
|
||||||
"reverse_faces",
|
"reverse_faces",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "faces"}, //input faces
|
{{BMO_OP_SLOT_ELEMENT_BUF, "faces"}, /* input faces */
|
||||||
{0} /* null-terminating sentinel */,
|
{0} /* null-terminating sentinel */,
|
||||||
},
|
},
|
||||||
bmo_reverse_faces_exec,
|
bmo_reverse_faces_exec,
|
||||||
@ -188,9 +188,9 @@ static BMOpDefine bmo_reverse_faces_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_bisect_edges_def = {
|
static BMOpDefine bmo_bisect_edges_def = {
|
||||||
"bisect_edges",
|
"bisect_edges",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "edges"}, //input edges
|
{{BMO_OP_SLOT_ELEMENT_BUF, "edges"}, /* input edges */
|
||||||
{BMO_OP_SLOT_INT, "numcuts"}, //number of cuts
|
{BMO_OP_SLOT_INT, "numcuts"}, /* number of cuts */
|
||||||
{BMO_OP_SLOT_ELEMENT_BUF, "outsplit"}, //newly created vertices and edges
|
{BMO_OP_SLOT_ELEMENT_BUF, "outsplit"}, /* newly created vertices and edges */
|
||||||
{0} /* null-terminating sentinel */,
|
{0} /* null-terminating sentinel */,
|
||||||
},
|
},
|
||||||
bmo_bisect_edges_exec,
|
bmo_bisect_edges_exec,
|
||||||
@ -207,13 +207,13 @@ static BMOpDefine bmo_bisect_edges_def = {
|
|||||||
|
|
||||||
static BMOpDefine bmo_mirror_def = {
|
static BMOpDefine bmo_mirror_def = {
|
||||||
"mirror",
|
"mirror",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "geom"}, //input geometry
|
{{BMO_OP_SLOT_ELEMENT_BUF, "geom"}, /* input geometry */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix defining the mirror transformation
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix defining the mirror transformation */
|
||||||
{BMO_OP_SLOT_FLT, "mergedist"}, //maximum distance for merging. does no merging if 0.
|
{BMO_OP_SLOT_FLT, "mergedist"}, /* maximum distance for merging. does no merging if 0. */
|
||||||
{BMO_OP_SLOT_ELEMENT_BUF, "newout"}, //output geometry, mirrored
|
{BMO_OP_SLOT_ELEMENT_BUF, "newout"}, /* output geometry, mirrored */
|
||||||
{BMO_OP_SLOT_INT, "axis"}, //the axis to use, 0, 1, or 2 for x, y, z
|
{BMO_OP_SLOT_INT, "axis"}, /* the axis to use, 0, 1, or 2 for x, y, z */
|
||||||
{BMO_OP_SLOT_BOOL, "mirror_u"}, //mirror UVs across the u axis
|
{BMO_OP_SLOT_BOOL, "mirror_u"}, /* mirror UVs across the u axis */
|
||||||
{BMO_OP_SLOT_BOOL, "mirror_v"}, //mirror UVs across the v axis
|
{BMO_OP_SLOT_BOOL, "mirror_v"}, /* mirror UVs across the v axis */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_mirror_exec,
|
bmo_mirror_exec,
|
||||||
0,
|
0,
|
||||||
@ -230,9 +230,9 @@ static BMOpDefine bmo_mirror_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_find_doubles_def = {
|
static BMOpDefine bmo_find_doubles_def = {
|
||||||
"find_doubles",
|
"find_doubles",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, //input vertices
|
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, /* input vertices */
|
||||||
{BMO_OP_SLOT_ELEMENT_BUF, "keep_verts"}, //list of verts to keep
|
{BMO_OP_SLOT_ELEMENT_BUF, "keep_verts"}, /* list of verts to keep */
|
||||||
{BMO_OP_SLOT_FLT, "dist"}, //minimum distance
|
{BMO_OP_SLOT_FLT, "dist"}, /* minimum distance */
|
||||||
{BMO_OP_SLOT_MAPPING, "targetmapout"},
|
{BMO_OP_SLOT_MAPPING, "targetmapout"},
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_find_doubles_exec,
|
bmo_find_doubles_exec,
|
||||||
@ -247,8 +247,8 @@ static BMOpDefine bmo_find_doubles_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_remove_doubles_def = {
|
static BMOpDefine bmo_remove_doubles_def = {
|
||||||
"remove_doubles",
|
"remove_doubles",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, //input verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, /* input verts */
|
||||||
{BMO_OP_SLOT_FLT, "dist"}, //minimum distance
|
{BMO_OP_SLOT_FLT, "dist"}, /* minimum distance */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_remove_doubles_exec,
|
bmo_remove_doubles_exec,
|
||||||
BMO_OP_FLAG_UNTAN_MULTIRES,
|
BMO_OP_FLAG_UNTAN_MULTIRES,
|
||||||
@ -263,8 +263,8 @@ static BMOpDefine bmo_remove_doubles_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_automerge_def = {
|
static BMOpDefine bmo_automerge_def = {
|
||||||
"automerge",
|
"automerge",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, //input verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, /* input verts */
|
||||||
{BMO_OP_SLOT_FLT, "dist"}, //minimum distance
|
{BMO_OP_SLOT_FLT, "dist"}, /* minimum distance */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_automerge_exec,
|
bmo_automerge_exec,
|
||||||
BMO_OP_FLAG_UNTAN_MULTIRES,
|
BMO_OP_FLAG_UNTAN_MULTIRES,
|
||||||
@ -916,11 +916,11 @@ static BMOpDefine bmo_split_edges_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_create_grid_def = {
|
static BMOpDefine bmo_create_grid_def = {
|
||||||
"create_grid",
|
"create_grid",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, /* output verts */
|
||||||
{BMO_OP_SLOT_INT, "xsegments"}, //number of x segments
|
{BMO_OP_SLOT_INT, "xsegments"}, /* number of x segments */
|
||||||
{BMO_OP_SLOT_INT, "ysegments"}, //number of y segments
|
{BMO_OP_SLOT_INT, "ysegments"}, /* number of y segments */
|
||||||
{BMO_OP_SLOT_FLT, "size"}, //size of the grid
|
{BMO_OP_SLOT_FLT, "size"}, /* size of the grid */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix to multiply the new geometry with
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix to multiply the new geometry with */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_create_grid_exec,
|
bmo_create_grid_exec,
|
||||||
0,
|
0,
|
||||||
@ -933,11 +933,11 @@ static BMOpDefine bmo_create_grid_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_create_uvsphere_def = {
|
static BMOpDefine bmo_create_uvsphere_def = {
|
||||||
"create_uvsphere",
|
"create_uvsphere",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, /* output verts */
|
||||||
{BMO_OP_SLOT_INT, "segments"}, //number of u segments
|
{BMO_OP_SLOT_INT, "segments"}, /* number of u segments */
|
||||||
{BMO_OP_SLOT_INT, "revolutions"}, //number of v segment
|
{BMO_OP_SLOT_INT, "revolutions"}, /* number of v segment */
|
||||||
{BMO_OP_SLOT_FLT, "diameter"}, //diameter
|
{BMO_OP_SLOT_FLT, "diameter"}, /* diameter */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix to multiply the new geometry with-- */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_create_uvsphere_exec,
|
bmo_create_uvsphere_exec,
|
||||||
0,
|
0,
|
||||||
@ -950,10 +950,10 @@ static BMOpDefine bmo_create_uvsphere_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_create_icosphere_def = {
|
static BMOpDefine bmo_create_icosphere_def = {
|
||||||
"create_icosphere",
|
"create_icosphere",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, /* output verts */
|
||||||
{BMO_OP_SLOT_INT, "subdivisions"}, //how many times to recursively subdivide the sphere
|
{BMO_OP_SLOT_INT, "subdivisions"}, /* how many times to recursively subdivide the sphere */
|
||||||
{BMO_OP_SLOT_FLT, "diameter"}, //diameter
|
{BMO_OP_SLOT_FLT, "diameter"}, /* diameter */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix to multiply the new geometry with
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix to multiply the new geometry with */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_create_icosphere_exec,
|
bmo_create_icosphere_exec,
|
||||||
0,
|
0,
|
||||||
@ -966,8 +966,8 @@ static BMOpDefine bmo_create_icosphere_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_create_monkey_def = {
|
static BMOpDefine bmo_create_monkey_def = {
|
||||||
"create_monkey",
|
"create_monkey",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, /* output verts */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix to multiply the new geometry with-- */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_create_monkey_exec,
|
bmo_create_monkey_exec,
|
||||||
0,
|
0,
|
||||||
@ -980,14 +980,14 @@ static BMOpDefine bmo_create_monkey_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_create_cone_def = {
|
static BMOpDefine bmo_create_cone_def = {
|
||||||
"create_cone",
|
"create_cone",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, /* output verts */
|
||||||
{BMO_OP_SLOT_BOOL, "cap_ends"}, //wheter or not to fill in the ends with faces
|
{BMO_OP_SLOT_BOOL, "cap_ends"}, /* wheter or not to fill in the ends with faces */
|
||||||
{BMO_OP_SLOT_BOOL, "cap_tris"}, //fill ends with triangles instead of ngons
|
{BMO_OP_SLOT_BOOL, "cap_tris"}, /* fill ends with triangles instead of ngons */
|
||||||
{BMO_OP_SLOT_INT, "segments"},
|
{BMO_OP_SLOT_INT, "segments"},
|
||||||
{BMO_OP_SLOT_FLT, "diameter1"}, //diameter of one end
|
{BMO_OP_SLOT_FLT, "diameter1"}, /* diameter of one end */
|
||||||
{BMO_OP_SLOT_FLT, "diameter2"}, //diameter of the opposite
|
{BMO_OP_SLOT_FLT, "diameter2"}, /* diameter of the opposite */
|
||||||
{BMO_OP_SLOT_FLT, "depth"}, //distance between ends
|
{BMO_OP_SLOT_FLT, "depth"}, /* distance between ends */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix to multiply the new geometry with-- */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_create_cone_exec,
|
bmo_create_cone_exec,
|
||||||
0,
|
0,
|
||||||
@ -998,12 +998,12 @@ static BMOpDefine bmo_create_cone_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_create_circle_def = {
|
static BMOpDefine bmo_create_circle_def = {
|
||||||
"create_circle",
|
"create_circle",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, /* output verts */
|
||||||
{BMO_OP_SLOT_BOOL, "cap_ends"}, //wheter or not to fill in the ends with faces
|
{BMO_OP_SLOT_BOOL, "cap_ends"}, /* wheter or not to fill in the ends with faces */
|
||||||
{BMO_OP_SLOT_BOOL, "cap_tris"}, //fill ends with triangles instead of ngons
|
{BMO_OP_SLOT_BOOL, "cap_tris"}, /* fill ends with triangles instead of ngons */
|
||||||
{BMO_OP_SLOT_INT, "segments"},
|
{BMO_OP_SLOT_INT, "segments"},
|
||||||
{BMO_OP_SLOT_FLT, "diameter"}, //diameter of one end
|
{BMO_OP_SLOT_FLT, "diameter"}, /* diameter of one end */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix to multiply the new geometry with-- */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_create_circle_exec,
|
bmo_create_circle_exec,
|
||||||
0,
|
0,
|
||||||
@ -1016,9 +1016,9 @@ static BMOpDefine bmo_create_circle_def = {
|
|||||||
*/
|
*/
|
||||||
static BMOpDefine bmo_create_cube_def = {
|
static BMOpDefine bmo_create_cube_def = {
|
||||||
"create_cube",
|
"create_cube",
|
||||||
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
|
{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, /* output verts */
|
||||||
{BMO_OP_SLOT_FLT, "size"}, //size of the cube
|
{BMO_OP_SLOT_FLT, "size"}, /* size of the cube */
|
||||||
{BMO_OP_SLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
|
{BMO_OP_SLOT_MAT, "mat"}, /* matrix to multiply the new geometry with-- */
|
||||||
{0, /* null-terminating sentinel */}},
|
{0, /* null-terminating sentinel */}},
|
||||||
bmo_create_cube_exec,
|
bmo_create_cube_exec,
|
||||||
0,
|
0,
|
||||||
|
@ -31,6 +31,13 @@
|
|||||||
#include "BLI_math.h"
|
#include "BLI_math.h"
|
||||||
#include "BLI_utildefines.h"
|
#include "BLI_utildefines.h"
|
||||||
|
|
||||||
|
/*XXX: This operator doesn't work well (at all?) for flat surfaces with
|
||||||
|
* >3 sides - creating overlapping faces at times.
|
||||||
|
* An easy workaround is to add in some noise but this is
|
||||||
|
* weak and unreliable, ideally this would detect flat surfaces
|
||||||
|
* (possibly making them into ngons) - see
|
||||||
|
*/
|
||||||
|
|
||||||
/* XXX: using 128 for totelem and pchunk of mempool, no idea what good
|
/* XXX: using 128 for totelem and pchunk of mempool, no idea what good
|
||||||
* values would be though */
|
* values would be though */
|
||||||
#include "BLI_mempool.h"
|
#include "BLI_mempool.h"
|
||||||
|
@ -160,15 +160,13 @@ bool BokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cl_kernel kernel = 0;
|
|
||||||
void BokehBlurOperation::executeOpenCL(OpenCLDevice* device,
|
void BokehBlurOperation::executeOpenCL(OpenCLDevice* device,
|
||||||
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
||||||
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
||||||
list<cl_kernel> *clKernelsToCleanUp)
|
list<cl_kernel> *clKernelsToCleanUp)
|
||||||
{
|
{
|
||||||
if (!kernel) {
|
cl_kernel kernel = device->COM_clCreateKernel("bokehBlurKernel", NULL);
|
||||||
kernel = device->COM_clCreateKernel("bokehBlurKernel", NULL);
|
|
||||||
}
|
|
||||||
cl_int radius = this->getWidth() * this->m_size / 100.0f;
|
cl_int radius = this->getWidth() * this->m_size / 100.0f;
|
||||||
cl_int step = this->getStep();
|
cl_int step = this->getStep();
|
||||||
|
|
||||||
|
@ -234,15 +234,13 @@ bool DilateDistanceOperation::determineDependingAreaOfInterest(rcti *input, Read
|
|||||||
return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
|
return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cl_kernel dilateKernel = 0;
|
|
||||||
void DilateDistanceOperation::executeOpenCL(OpenCLDevice* device,
|
void DilateDistanceOperation::executeOpenCL(OpenCLDevice* device,
|
||||||
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
||||||
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
||||||
list<cl_kernel> *clKernelsToCleanUp)
|
list<cl_kernel> *clKernelsToCleanUp)
|
||||||
{
|
{
|
||||||
if (!dilateKernel) {
|
cl_kernel dilateKernel = device->COM_clCreateKernel("dilateKernel", NULL);
|
||||||
dilateKernel = device->COM_clCreateKernel("dilateKernel", NULL);
|
|
||||||
}
|
|
||||||
cl_int distanceSquared = this->m_distance * this->m_distance;
|
cl_int distanceSquared = this->m_distance * this->m_distance;
|
||||||
cl_int scope = this->m_scope;
|
cl_int scope = this->m_scope;
|
||||||
|
|
||||||
@ -293,15 +291,13 @@ void ErodeDistanceOperation::executePixel(float *color, int x, int y, MemoryBuff
|
|||||||
color[0] = value;
|
color[0] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cl_kernel erodeKernel = 0;
|
|
||||||
void ErodeDistanceOperation::executeOpenCL(OpenCLDevice* device,
|
void ErodeDistanceOperation::executeOpenCL(OpenCLDevice* device,
|
||||||
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
||||||
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
||||||
list<cl_kernel> *clKernelsToCleanUp)
|
list<cl_kernel> *clKernelsToCleanUp)
|
||||||
{
|
{
|
||||||
if (!erodeKernel) {
|
cl_kernel erodeKernel = device->COM_clCreateKernel("erodeKernel", NULL);
|
||||||
erodeKernel = device->COM_clCreateKernel("erodeKernel", NULL);
|
|
||||||
}
|
|
||||||
cl_int distanceSquared = this->m_distance * this->m_distance;
|
cl_int distanceSquared = this->m_distance * this->m_distance;
|
||||||
cl_int scope = this->m_scope;
|
cl_int scope = this->m_scope;
|
||||||
|
|
||||||
|
@ -130,15 +130,13 @@ void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, Me
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static cl_kernel defocusKernel = 0;
|
|
||||||
void VariableSizeBokehBlurOperation::executeOpenCL(OpenCLDevice* device,
|
void VariableSizeBokehBlurOperation::executeOpenCL(OpenCLDevice* device,
|
||||||
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer,
|
||||||
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
MemoryBuffer **inputMemoryBuffers, list<cl_mem> *clMemToCleanUp,
|
||||||
list<cl_kernel> *clKernelsToCleanUp)
|
list<cl_kernel> *clKernelsToCleanUp)
|
||||||
{
|
{
|
||||||
if (!defocusKernel) {
|
cl_kernel defocusKernel = device->COM_clCreateKernel("defocusKernel", NULL);
|
||||||
defocusKernel = device->COM_clCreateKernel("defocusKernel", NULL);
|
|
||||||
}
|
|
||||||
cl_int step = this->getStep();
|
cl_int step = this->getStep();
|
||||||
cl_int maxBlur = this->m_maxBlur;
|
cl_int maxBlur = this->m_maxBlur;
|
||||||
cl_float threshold = this->m_threshold;
|
cl_float threshold = this->m_threshold;
|
||||||
|
@ -3011,12 +3011,12 @@ void ANIM_channel_draw(bAnimContext *ac, bAnimListElem *ale, float yminc, float
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* step 5) draw name ............................................... */
|
/* step 5) draw name ............................................... */
|
||||||
// TODO: when renaming, we might not want to draw this, especially if name happens to be longer than channel
|
/* TODO: when renaming, we might not want to draw this, especially if name happens to be longer than channel */
|
||||||
if (acf->name) {
|
if (acf->name) {
|
||||||
char name[ANIM_CHAN_NAME_SIZE]; /* hopefully this will be enough! */
|
char name[ANIM_CHAN_NAME_SIZE]; /* hopefully this will be enough! */
|
||||||
|
|
||||||
/* set text color */
|
/* set text color */
|
||||||
// XXX: if active, highlight differently?
|
/* XXX: if active, highlight differently? */
|
||||||
if (selected)
|
if (selected)
|
||||||
UI_ThemeColor(TH_TEXT_HI);
|
UI_ThemeColor(TH_TEXT_HI);
|
||||||
else
|
else
|
||||||
@ -3030,7 +3030,7 @@ void ANIM_channel_draw(bAnimContext *ac, bAnimListElem *ale, float yminc, float
|
|||||||
|
|
||||||
/* draw red underline if channel is disabled */
|
/* draw red underline if channel is disabled */
|
||||||
if ((ale->type == ANIMTYPE_FCURVE) && (ale->flag & FCURVE_DISABLED)) {
|
if ((ale->type == ANIMTYPE_FCURVE) && (ale->flag & FCURVE_DISABLED)) {
|
||||||
// FIXME: replace hardcoded color here, and check on extents!
|
/* FIXME: replace hardcoded color here, and check on extents! */
|
||||||
glColor3f(1.0f, 0.0f, 0.0f);
|
glColor3f(1.0f, 0.0f, 0.0f);
|
||||||
glLineWidth(2.0);
|
glLineWidth(2.0);
|
||||||
fdrawline((float)(offset), yminc,
|
fdrawline((float)(offset), yminc,
|
||||||
@ -3043,7 +3043,7 @@ void ANIM_channel_draw(bAnimContext *ac, bAnimListElem *ale, float yminc, float
|
|||||||
/* reset offset - now goes from RHS of panel */
|
/* reset offset - now goes from RHS of panel */
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
|
||||||
// TODO: when drawing sliders, make those draw instead of these toggles if not enough space
|
/* TODO: when drawing sliders, make those draw instead of these toggles if not enough space */
|
||||||
|
|
||||||
if (v2d) {
|
if (v2d) {
|
||||||
short draw_sliders = 0;
|
short draw_sliders = 0;
|
||||||
|
@ -400,7 +400,7 @@ void ANIM_flush_setting_anim_channels(bAnimContext *ac, ListBase *anim_data, bAn
|
|||||||
/* compare data, and type as main way of identifying the channel */
|
/* compare data, and type as main way of identifying the channel */
|
||||||
if ((ale->data == ale_setting->data) && (ale->type == ale_setting->type)) {
|
if ((ale->data == ale_setting->data) && (ale->type == ale_setting->type)) {
|
||||||
/* we also have to check the ID, this is assigned to, since a block may have multiple users */
|
/* we also have to check the ID, this is assigned to, since a block may have multiple users */
|
||||||
// TODO: is the owner-data more revealing?
|
/* TODO: is the owner-data more revealing? */
|
||||||
if (ale->id == ale_setting->id) {
|
if (ale->id == ale_setting->id) {
|
||||||
match = ale;
|
match = ale;
|
||||||
break;
|
break;
|
||||||
@ -576,7 +576,7 @@ static int animedit_poll_channels_active(bContext *C)
|
|||||||
ScrArea *sa = CTX_wm_area(C);
|
ScrArea *sa = CTX_wm_area(C);
|
||||||
|
|
||||||
/* channels region test */
|
/* channels region test */
|
||||||
// TODO: could enhance with actually testing if channels region?
|
/* TODO: could enhance with actually testing if channels region? */
|
||||||
if (ELEM(NULL, sa, CTX_wm_region(C)))
|
if (ELEM(NULL, sa, CTX_wm_region(C)))
|
||||||
return 0;
|
return 0;
|
||||||
/* animation editor test */
|
/* animation editor test */
|
||||||
@ -593,7 +593,7 @@ static int animedit_poll_channels_nla_tweakmode_off(bContext *C)
|
|||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
|
|
||||||
/* channels region test */
|
/* channels region test */
|
||||||
// TODO: could enhance with actually testing if channels region?
|
/* TODO: could enhance with actually testing if channels region? */
|
||||||
if (ELEM(NULL, sa, CTX_wm_region(C)))
|
if (ELEM(NULL, sa, CTX_wm_region(C)))
|
||||||
return 0;
|
return 0;
|
||||||
/* animation editor test */
|
/* animation editor test */
|
||||||
@ -1317,7 +1317,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *UNUSED(op))
|
|||||||
|
|
||||||
for (ale = anim_data.first; ale; ale = ale->next) {
|
for (ale = anim_data.first; ale; ale = ale->next) {
|
||||||
/* hack: skip object channels for now, since flushing those will always flush everything, but they are always included */
|
/* hack: skip object channels for now, since flushing those will always flush everything, but they are always included */
|
||||||
// TODO: find out why this is the case, and fix that
|
/* TODO: find out why this is the case, and fix that */
|
||||||
if (ale->type == ANIMTYPE_OBJECT)
|
if (ale->type == ANIMTYPE_OBJECT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1394,7 +1394,7 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *UNUSED(o
|
|||||||
/* Now set the flags */
|
/* Now set the flags */
|
||||||
for (ale = anim_data.first; ale; ale = ale->next) {
|
for (ale = anim_data.first; ale; ale = ale->next) {
|
||||||
/* hack: skip object channels for now, since flushing those will always flush everything, but they are always included */
|
/* hack: skip object channels for now, since flushing those will always flush everything, but they are always included */
|
||||||
// TODO: find out why this is the case, and fix that
|
/* TODO: find out why this is the case, and fix that */
|
||||||
if (ale->type == ANIMTYPE_OBJECT)
|
if (ale->type == ANIMTYPE_OBJECT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1736,7 +1736,7 @@ static int animchannels_enable_poll(bContext *C)
|
|||||||
ScrArea *sa = CTX_wm_area(C);
|
ScrArea *sa = CTX_wm_area(C);
|
||||||
|
|
||||||
/* channels region test */
|
/* channels region test */
|
||||||
// TODO: could enhance with actually testing if channels region?
|
/* TODO: could enhance with actually testing if channels region? */
|
||||||
if (ELEM(NULL, sa, CTX_wm_region(C)))
|
if (ELEM(NULL, sa, CTX_wm_region(C)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -2105,7 +2105,7 @@ static int mouse_anim_channels(bAnimContext *ac, float UNUSED(x), int channel_in
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* selectmode -1 is a special case for ActionGroups only, which selects all of the channels underneath it only... */
|
/* selectmode -1 is a special case for ActionGroups only, which selects all of the channels underneath it only... */
|
||||||
// TODO: should this feature be extended to work with other channel types too?
|
/* TODO: should this feature be extended to work with other channel types too? */
|
||||||
if ((selectmode == -1) && (ale->type != ANIMTYPE_GROUP)) {
|
if ((selectmode == -1) && (ale->type != ANIMTYPE_GROUP)) {
|
||||||
/* normal channels should not behave normally in this case */
|
/* normal channels should not behave normally in this case */
|
||||||
BLI_freelistN(&anim_data);
|
BLI_freelistN(&anim_data);
|
||||||
@ -2113,7 +2113,7 @@ static int mouse_anim_channels(bAnimContext *ac, float UNUSED(x), int channel_in
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* action to take depends on what channel we've got */
|
/* action to take depends on what channel we've got */
|
||||||
// WARNING: must keep this in sync with the equivalent function in nla_channels.c
|
/* WARNING: must keep this in sync with the equivalent function in nla_channels.c */
|
||||||
switch (ale->type) {
|
switch (ale->type) {
|
||||||
case ANIMTYPE_SCENE:
|
case ANIMTYPE_SCENE:
|
||||||
{
|
{
|
||||||
@ -2154,7 +2154,7 @@ static int mouse_anim_channels(bAnimContext *ac, float UNUSED(x), int channel_in
|
|||||||
Base *b;
|
Base *b;
|
||||||
|
|
||||||
/* deselect all */
|
/* deselect all */
|
||||||
// TODO: should this deselect all other types of channels too?
|
/* TODO: should this deselect all other types of channels too? */
|
||||||
for (b = sce->base.first; b; b = b->next) {
|
for (b = sce->base.first; b; b = b->next) {
|
||||||
b->flag &= ~SELECT;
|
b->flag &= ~SELECT;
|
||||||
b->object->flag = b->flag;
|
b->object->flag = b->flag;
|
||||||
@ -2441,7 +2441,7 @@ void ED_operatortypes_animchannels(void)
|
|||||||
|
|
||||||
WM_operatortype_append(ANIM_OT_channels_delete);
|
WM_operatortype_append(ANIM_OT_channels_delete);
|
||||||
|
|
||||||
// XXX does this need to be a separate operator?
|
/* XXX does this need to be a separate operator? */
|
||||||
WM_operatortype_append(ANIM_OT_channels_editable_toggle);
|
WM_operatortype_append(ANIM_OT_channels_editable_toggle);
|
||||||
|
|
||||||
WM_operatortype_append(ANIM_OT_channels_move);
|
WM_operatortype_append(ANIM_OT_channels_move);
|
||||||
@ -2463,7 +2463,7 @@ void ED_keymap_animchannels(wmKeyConfig *keyconf)
|
|||||||
|
|
||||||
/* selection */
|
/* selection */
|
||||||
/* click-select */
|
/* click-select */
|
||||||
// XXX for now, only leftmouse....
|
/* XXX for now, only leftmouse.... */
|
||||||
WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0);
|
WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0);
|
||||||
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", TRUE);
|
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", TRUE);
|
||||||
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "children_only", TRUE);
|
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "children_only", TRUE);
|
||||||
|
@ -382,7 +382,7 @@ float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short rest
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: other rotation types here as necessary
|
/* TODO: other rotation types here as necessary */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ static short actedit_get_context(bAnimContext *ac, SpaceAction *saction)
|
|||||||
ac->mode = saction->mode;
|
ac->mode = saction->mode;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case SACTCONT_GPENCIL: /* Grease Pencil */ // XXX review how this mode is handled...
|
case SACTCONT_GPENCIL: /* Grease Pencil */ /* XXX review how this mode is handled... */
|
||||||
/* update scene-pointer (no need to check for pinning yet, as not implemented) */
|
/* update scene-pointer (no need to check for pinning yet, as not implemented) */
|
||||||
saction->ads.source = (ID *)ac->scene;
|
saction->ads.source = (ID *)ac->scene;
|
||||||
|
|
||||||
@ -175,10 +175,10 @@ static short actedit_get_context(bAnimContext *ac, SpaceAction *saction)
|
|||||||
ac->mode = saction->mode;
|
ac->mode = saction->mode;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case SACTCONT_MASK: /* Grease Pencil */ // XXX review how this mode is handled...
|
case SACTCONT_MASK: /* Grease Pencil */ /* XXX review how this mode is handled... */
|
||||||
/* update scene-pointer (no need to check for pinning yet, as not implemented) */
|
/* update scene-pointer (no need to check for pinning yet, as not implemented) */
|
||||||
{
|
{
|
||||||
// TODO, other methods to get the mask
|
/* TODO, other methods to get the mask */
|
||||||
// Sequence *seq = BKE_sequencer_active_get(ac->scene);
|
// Sequence *seq = BKE_sequencer_active_get(ac->scene);
|
||||||
//MovieClip *clip = ac->scene->clip;
|
//MovieClip *clip = ac->scene->clip;
|
||||||
// struct Mask *mask = seq ? seq->mask : NULL;
|
// struct Mask *mask = seq ? seq->mask : NULL;
|
||||||
@ -1892,7 +1892,7 @@ static size_t animdata_filter_ds_obanim(bAnimContext *ac, ListBase *anim_data, b
|
|||||||
void *cdata = NULL;
|
void *cdata = NULL;
|
||||||
|
|
||||||
/* determine the type of expander channels to use */
|
/* determine the type of expander channels to use */
|
||||||
// this is the best way to do this for now...
|
/* this is the best way to do this for now... */
|
||||||
ANIMDATA_FILTER_CASES(ob,
|
ANIMDATA_FILTER_CASES(ob,
|
||||||
{ /* AnimData - no channel, but consider data */ },
|
{ /* AnimData - no channel, but consider data */ },
|
||||||
{ /* NLA - no channel, but consider data */ },
|
{ /* NLA - no channel, but consider data */ },
|
||||||
@ -2123,7 +2123,7 @@ static size_t animdata_filter_dopesheet_scene(bAnimContext *ac, ListBase *anim_d
|
|||||||
tmp_items += animdata_filter_ds_nodetree(ac, &tmp_data, ads, (ID *)sce, ntree, filter_mode);
|
tmp_items += animdata_filter_ds_nodetree(ac, &tmp_data, ads, (ID *)sce, ntree, filter_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: one day, when sequencer becomes its own datatype, perhaps it should be included here
|
/* TODO: one day, when sequencer becomes its own datatype, perhaps it should be included here */
|
||||||
}
|
}
|
||||||
END_ANIMFILTER_SUBCHANNELS;
|
END_ANIMFILTER_SUBCHANNELS;
|
||||||
|
|
||||||
|
@ -145,8 +145,8 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* putting this all together into the buffer */
|
/* putting this all together into the buffer */
|
||||||
// XXX we need to check for invalid names...
|
/* XXX we need to check for invalid names...
|
||||||
// XXX the name length limit needs to be passed in or as some define
|
* XXX the name length limit needs to be passed in or as some define */
|
||||||
if (structname)
|
if (structname)
|
||||||
BLI_snprintf(name, 256, "%s%s (%s)", arrayname, propname, structname);
|
BLI_snprintf(name, 256, "%s%s (%s)", arrayname, propname, structname);
|
||||||
else
|
else
|
||||||
@ -172,7 +172,7 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
|
|||||||
BLI_snprintf(name, 256, "\"%s[%d]\"", fcu->rna_path, fcu->array_index);
|
BLI_snprintf(name, 256, "\"%s[%d]\"", fcu->rna_path, fcu->array_index);
|
||||||
|
|
||||||
/* icon for this should be the icon for the base ID */
|
/* icon for this should be the icon for the base ID */
|
||||||
// TODO: or should we just use the error icon?
|
/* TODO: or should we just use the error icon? */
|
||||||
icon = RNA_struct_ui_icon(id_ptr.type);
|
icon = RNA_struct_ui_icon(id_ptr.type);
|
||||||
|
|
||||||
/* tag F-Curve as disabled - as not usable path */
|
/* tag F-Curve as disabled - as not usable path */
|
||||||
|
@ -508,8 +508,8 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
|
|||||||
uiItemR(row, &ptr, "default_max", 0, IFACE_("Max"), ICON_NONE);
|
uiItemR(row, &ptr, "default_max", 0, IFACE_("Max"), ICON_NONE);
|
||||||
|
|
||||||
/* control points header */
|
/* control points header */
|
||||||
// TODO: move this control-point control stuff to using the new special widgets for lists
|
/* TODO: move this control-point control stuff to using the new special widgets for lists
|
||||||
// the current way is far too cramped
|
* the current way is far too cramped */
|
||||||
row = uiLayoutRow(layout, FALSE);
|
row = uiLayoutRow(layout, FALSE);
|
||||||
block = uiLayoutGetBlock(row);
|
block = uiLayoutGetBlock(row);
|
||||||
|
|
||||||
|
@ -673,7 +673,7 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
|
|||||||
/* draw keys */
|
/* draw keys */
|
||||||
if (keys) {
|
if (keys) {
|
||||||
/* locked channels are less strongly shown, as feedback for locked channels in DopeSheet */
|
/* locked channels are less strongly shown, as feedback for locked channels in DopeSheet */
|
||||||
// TODO: allow this opacity factor to be themed?
|
/* TODO: allow this opacity factor to be themed? */
|
||||||
float kalpha = (channelLocked) ? 0.35f : 1.0f;
|
float kalpha = (channelLocked) ? 0.35f : 1.0f;
|
||||||
|
|
||||||
for (ak = keys->first; ak; ak = ak->next) {
|
for (ak = keys->first; ak; ak = ak->next) {
|
||||||
@ -684,8 +684,8 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* draw using OpenGL - uglier but faster */
|
/* draw using OpenGL - uglier but faster */
|
||||||
// NOTE1: a previous version of this didn't work nice for some intel cards
|
/* NOTE1: a previous version of this didn't work nice for some intel cards
|
||||||
// NOTE2: if we wanted to go back to icons, these are icon = (ak->sel & SELECT) ? ICON_SPACE2 : ICON_SPACE3;
|
* NOTE2: if we wanted to go back to icons, these are icon = (ak->sel & SELECT) ? ICON_SPACE2 : ICON_SPACE3; */
|
||||||
draw_keyframe_shape(ak->cfra, ypos, xscale, 5.0f, (ak->sel & SELECT), ak->key_type, KEYFRAME_SHAPE_BOTH, kalpha);
|
draw_keyframe_shape(ak->cfra, ypos, xscale, 5.0f, (ak->sel & SELECT), ak->key_type, KEYFRAME_SHAPE_BOTH, kalpha);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ bAction *verify_adt_action(ID *id, short add)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* init action if none available yet */
|
/* init action if none available yet */
|
||||||
// TODO: need some wizardry to handle NLA stuff correct
|
/* TODO: need some wizardry to handle NLA stuff correct */
|
||||||
if ((adt->action == NULL) && (add)) {
|
if ((adt->action == NULL) && (add)) {
|
||||||
char actname[sizeof(id->name) - 2];
|
char actname[sizeof(id->name) - 2];
|
||||||
BLI_snprintf(actname, sizeof(actname), "%sAction", id->name + 2);
|
BLI_snprintf(actname, sizeof(actname), "%sAction", id->name + 2);
|
||||||
@ -257,7 +257,7 @@ int insert_bezt_fcurve(FCurve *fcu, BezTriple *bezt, short flag)
|
|||||||
dst->f2 = bezt->f2;
|
dst->f2 = bezt->f2;
|
||||||
dst->f3 = bezt->f3;
|
dst->f3 = bezt->f3;
|
||||||
|
|
||||||
// TODO: perform some other operations?
|
/* TODO: perform some other operations? */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* keyframing modes allow to not replace keyframe */
|
/* keyframing modes allow to not replace keyframe */
|
||||||
@ -1693,7 +1693,7 @@ static short object_frame_has_keyframe(Object *ob, float frame, short filter)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* 2. test for time */
|
/* 2. test for time */
|
||||||
// TODO... yet to be implemented (this feature may evolve before then anyway)
|
/* TODO... yet to be implemented (this feature may evolve before then anyway) */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* try materials */
|
/* try materials */
|
||||||
|
@ -599,8 +599,8 @@ void ANIM_keyingset_info_unregister(Main *bmain, KeyingSetInfo *ksi)
|
|||||||
KeyingSet *ks, *ksn;
|
KeyingSet *ks, *ksn;
|
||||||
|
|
||||||
/* find relevant builtin KeyingSets which use this, and remove them */
|
/* find relevant builtin KeyingSets which use this, and remove them */
|
||||||
// TODO: this isn't done now, since unregister is really only used atm when we
|
/* TODO: this isn't done now, since unregister is really only used atm when we
|
||||||
// reload the scripts, which kindof defeats the purpose of "builtin"?
|
* reload the scripts, which kindof defeats the purpose of "builtin"? */
|
||||||
for (ks = builtin_keyingsets.first; ks; ks = ksn) {
|
for (ks = builtin_keyingsets.first; ks; ks = ksn) {
|
||||||
ksn = ks->next;
|
ksn = ks->next;
|
||||||
|
|
||||||
@ -791,7 +791,7 @@ short ANIM_keyingset_context_ok_poll(bContext *C, KeyingSet *ks)
|
|||||||
/* get the associated 'type info' for this KeyingSet */
|
/* get the associated 'type info' for this KeyingSet */
|
||||||
if (ksi == NULL)
|
if (ksi == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
// TODO: check for missing callbacks!
|
/* TODO: check for missing callbacks! */
|
||||||
|
|
||||||
/* check if it can be used in the current context */
|
/* check if it can be used in the current context */
|
||||||
return (ksi->poll(ksi, C));
|
return (ksi->poll(ksi, C));
|
||||||
@ -878,7 +878,7 @@ short ANIM_validate_keyingset(bContext *C, ListBase *dsources, KeyingSet *ks)
|
|||||||
/* get the associated 'type info' for this KeyingSet */
|
/* get the associated 'type info' for this KeyingSet */
|
||||||
if (ksi == NULL)
|
if (ksi == NULL)
|
||||||
return MODIFYKEY_MISSING_TYPEINFO;
|
return MODIFYKEY_MISSING_TYPEINFO;
|
||||||
// TODO: check for missing callbacks!
|
/* TODO: check for missing callbacks! */
|
||||||
|
|
||||||
/* check if it can be used in the current context */
|
/* check if it can be used in the current context */
|
||||||
if (ksi->poll(ksi, C)) {
|
if (ksi->poll(ksi, C)) {
|
||||||
|
@ -191,8 +191,8 @@ void ED_operatormacros_armature(void)
|
|||||||
RNA_enum_set(otmacro->ptr, "proportional", 0);
|
RNA_enum_set(otmacro->ptr, "proportional", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX would it be nicer to just be able to have standard extrude_move, but set the forked property separate?
|
/* XXX would it be nicer to just be able to have standard extrude_move, but set the forked property separate?
|
||||||
// that would require fixing a properties bug 19733
|
* that would require fixing a properties bug 19733 */
|
||||||
ot = WM_operatortype_append_macro("ARMATURE_OT_extrude_forked", "Extrude Forked",
|
ot = WM_operatortype_append_macro("ARMATURE_OT_extrude_forked", "Extrude Forked",
|
||||||
"Create new bones from the selected joints and move them",
|
"Create new bones from the selected joints and move them",
|
||||||
OPTYPE_UNDO | OPTYPE_REGISTER);
|
OPTYPE_UNDO | OPTYPE_REGISTER);
|
||||||
@ -218,7 +218,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
|
|||||||
WM_keymap_add_item(keymap, "SKETCH_OT_delete", DELKEY, KM_PRESS, 0, 0);
|
WM_keymap_add_item(keymap, "SKETCH_OT_delete", DELKEY, KM_PRESS, 0, 0);
|
||||||
WM_keymap_add_item(keymap, "SKETCH_OT_finish_stroke", RIGHTMOUSE, KM_PRESS, 0, 0);
|
WM_keymap_add_item(keymap, "SKETCH_OT_finish_stroke", RIGHTMOUSE, KM_PRESS, 0, 0);
|
||||||
WM_keymap_add_item(keymap, "SKETCH_OT_cancel_stroke", ESCKEY, KM_PRESS, 0, 0);
|
WM_keymap_add_item(keymap, "SKETCH_OT_cancel_stroke", ESCKEY, KM_PRESS, 0, 0);
|
||||||
// Already part of view3d select
|
/* Already part of view3d select */
|
||||||
//WM_keymap_add_item(keymap, "SKETCH_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
|
//WM_keymap_add_item(keymap, "SKETCH_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
|
||||||
|
|
||||||
/* sketch poll checks mode */
|
/* sketch poll checks mode */
|
||||||
@ -321,7 +321,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
|
|||||||
|
|
||||||
WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_apply", AKEY, KM_PRESS, KM_CTRL, 0);
|
WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_apply", AKEY, KM_PRESS, KM_CTRL, 0);
|
||||||
|
|
||||||
// TODO: clear pose
|
/* TODO: clear pose */
|
||||||
WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0);
|
WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0);
|
||||||
WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0);
|
WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0);
|
||||||
WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
|
WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
|
||||||
|
@ -659,7 +659,7 @@ static int apply_armature_pose2bones_exec(bContext *C, wmOperator *op)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* helpful warnings... */
|
/* helpful warnings... */
|
||||||
// TODO: add warnings to be careful about actions, applying deforms first, etc.
|
/* TODO: add warnings to be careful about actions, applying deforms first, etc. */
|
||||||
if (ob->adt && ob->adt->action)
|
if (ob->adt && ob->adt->action)
|
||||||
BKE_report(op->reports, RPT_WARNING, "Actions on this armature will be destroyed by this new rest pose as the transforms stored are relative to the old rest pose");
|
BKE_report(op->reports, RPT_WARNING, "Actions on this armature will be destroyed by this new rest pose as the transforms stored are relative to the old rest pose");
|
||||||
|
|
||||||
@ -1194,7 +1194,7 @@ static int separate_armature_exec(bContext *C, wmOperator *UNUSED(op))
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* 1) only edit-base selected */
|
/* 1) only edit-base selected */
|
||||||
// TODO: use context iterators for this?
|
/* TODO: use context iterators for this? */
|
||||||
CTX_DATA_BEGIN(C, Base *, base, visible_bases)
|
CTX_DATA_BEGIN(C, Base *, base, visible_bases)
|
||||||
{
|
{
|
||||||
if (base->object == obedit) base->flag |= 1;
|
if (base->object == obedit) base->flag |= 1;
|
||||||
@ -1402,7 +1402,7 @@ static void selectconnected_posebonechildren(Object *ob, Bone *bone, int extend)
|
|||||||
if (!(bone->flag & BONE_CONNECTED) || (bone->flag & BONE_UNSELECTABLE))
|
if (!(bone->flag & BONE_CONNECTED) || (bone->flag & BONE_UNSELECTABLE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// XXX old cruft! use notifiers instead
|
/* XXX old cruft! use notifiers instead */
|
||||||
//select_actionchannel_by_name (ob->action, bone->name, !(shift));
|
//select_actionchannel_by_name (ob->action, bone->name, !(shift));
|
||||||
|
|
||||||
if (extend)
|
if (extend)
|
||||||
@ -5404,7 +5404,7 @@ static int hide_unselected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr
|
|||||||
bArmature *arm = ob->data;
|
bArmature *arm = ob->data;
|
||||||
|
|
||||||
if (arm->layer & bone->layer) {
|
if (arm->layer & bone->layer) {
|
||||||
// hrm... typo here?
|
/* hrm... typo here? */
|
||||||
if ((bone->flag & BONE_SELECTED) == 0) {
|
if ((bone->flag & BONE_SELECTED) == 0) {
|
||||||
bone->flag |= BONE_HIDDEN_P;
|
bone->flag |= BONE_HIDDEN_P;
|
||||||
if (arm->act_bone == bone)
|
if (arm->act_bone == bone)
|
||||||
|
@ -243,7 +243,7 @@ static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val)
|
|||||||
* - numerator should be larger than denominator to 'expand' the result
|
* - numerator should be larger than denominator to 'expand' the result
|
||||||
* - perform this weighting a number of times given by the percentage...
|
* - perform this weighting a number of times given by the percentage...
|
||||||
*/
|
*/
|
||||||
int iters = (int)ceil(10.0f * pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
|
int iters = (int)ceil(10.0f * pso->percentage); /* TODO: maybe a sensitivity ctrl on top of this is needed */
|
||||||
|
|
||||||
while (iters-- > 0) {
|
while (iters-- > 0) {
|
||||||
(*val) = (-((sVal * w2) + (eVal * w1)) + ((*val) * 6.0f) ) / 5.0f;
|
(*val) = (-((sVal * w2) + (eVal * w1)) + ((*val) * 6.0f) ) / 5.0f;
|
||||||
@ -257,7 +257,7 @@ static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val)
|
|||||||
* - numerator should be smaller than denominator to 'relax' the result
|
* - numerator should be smaller than denominator to 'relax' the result
|
||||||
* - perform this weighting a number of times given by the percentage...
|
* - perform this weighting a number of times given by the percentage...
|
||||||
*/
|
*/
|
||||||
int iters = (int)ceil(10.0f * pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
|
int iters = (int)ceil(10.0f * pso->percentage); /* TODO: maybe a sensitivity ctrl on top of this is needed */
|
||||||
|
|
||||||
while (iters-- > 0) {
|
while (iters-- > 0) {
|
||||||
(*val) = ( ((sVal * w2) + (eVal * w1)) + ((*val) * 5.0f) ) / 6.0f;
|
(*val) = ( ((sVal * w2) + (eVal * w1)) + ((*val) * 5.0f) ) / 6.0f;
|
||||||
@ -268,7 +268,7 @@ static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val)
|
|||||||
case POSESLIDE_BREAKDOWN: /* make the current pose slide around between the endpoints */
|
case POSESLIDE_BREAKDOWN: /* make the current pose slide around between the endpoints */
|
||||||
{
|
{
|
||||||
/* perform simple linear interpolation - coefficient for start must come from pso->percentage... */
|
/* perform simple linear interpolation - coefficient for start must come from pso->percentage... */
|
||||||
// TODO: make this use some kind of spline interpolation instead?
|
/* TODO: make this use some kind of spline interpolation instead? */
|
||||||
(*val) = ((sVal * w2) + (eVal * w1));
|
(*val) = ((sVal * w2) + (eVal * w1));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -417,7 +417,7 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl)
|
|||||||
float quat_diff[4], quat_orig[4];
|
float quat_diff[4], quat_orig[4];
|
||||||
|
|
||||||
/* calculate the delta transform from the previous to the current */
|
/* calculate the delta transform from the previous to the current */
|
||||||
// TODO: investigate ways to favour one transform more?
|
/* TODO: investigate ways to favour one transform more? */
|
||||||
sub_qt_qtqt(quat_diff, pchan->quat, quat_prev);
|
sub_qt_qtqt(quat_diff, pchan->quat, quat_prev);
|
||||||
|
|
||||||
/* make a copy of the original rotation */
|
/* make a copy of the original rotation */
|
||||||
@ -428,7 +428,7 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
float quat_interp[4], quat_orig[4];
|
float quat_interp[4], quat_orig[4];
|
||||||
int iters = (int)ceil(10.0f * pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
|
int iters = (int)ceil(10.0f * pso->percentage); /* TODO: maybe a sensitivity ctrl on top of this is needed */
|
||||||
|
|
||||||
/* perform this blending several times until a satisfactory result is reached */
|
/* perform this blending several times until a satisfactory result is reached */
|
||||||
while (iters-- > 0) {
|
while (iters-- > 0) {
|
||||||
|
@ -185,7 +185,7 @@ void poseAnim_mapping_refresh(bContext *C, Scene *scene, Object *ob)
|
|||||||
/* old optimize trick... this enforces to bypass the depgraph
|
/* old optimize trick... this enforces to bypass the depgraph
|
||||||
* - note: code copied from transform_generics.c -> recalcData()
|
* - note: code copied from transform_generics.c -> recalcData()
|
||||||
*/
|
*/
|
||||||
// FIXME: shouldn't this use the builtin stuff?
|
/* FIXME: shouldn't this use the builtin stuff? */
|
||||||
if ((arm->flag & ARM_DELAYDEFORM) == 0)
|
if ((arm->flag & ARM_DELAYDEFORM) == 0)
|
||||||
DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
|
DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
|
||||||
else
|
else
|
||||||
|
@ -310,7 +310,7 @@ static int poselib_sanitize_exec(bContext *C, wmOperator *op)
|
|||||||
/* for each key, make sure there is a corresponding pose */
|
/* for each key, make sure there is a corresponding pose */
|
||||||
for (ak = keys.first; ak; ak = ak->next) {
|
for (ak = keys.first; ak; ak = ak->next) {
|
||||||
/* check if any pose matches this */
|
/* check if any pose matches this */
|
||||||
// TODO: don't go looking through the list like this every time...
|
/* TODO: don't go looking through the list like this every time... */
|
||||||
for (marker = act->markers.first; marker; marker = marker->next) {
|
for (marker = act->markers.first; marker; marker = marker->next) {
|
||||||
if (IS_EQ(marker->frame, (double)ak->cfra)) {
|
if (IS_EQ(marker->frame, (double)ak->cfra)) {
|
||||||
marker->flag = -1;
|
marker->flag = -1;
|
||||||
@ -472,8 +472,8 @@ static int poselib_add_exec(bContext *C, wmOperator *op)
|
|||||||
BLI_uniquename(&act->markers, marker, "Pose", '.', offsetof(TimeMarker, name), sizeof(marker->name));
|
BLI_uniquename(&act->markers, marker, "Pose", '.', offsetof(TimeMarker, name), sizeof(marker->name));
|
||||||
|
|
||||||
/* use Keying Set to determine what to store for the pose */
|
/* use Keying Set to determine what to store for the pose */
|
||||||
// FIXME: in the past, the Keying Set respected selections (LocRotScale), but the current one doesn't (WholeCharacter)
|
/* FIXME: in the past, the Keying Set respected selections (LocRotScale), but the current one doesn't
|
||||||
// so perhaps we need either a new Keying Set, or just to add overrides here...
|
* (WholeCharacter) so perhaps we need either a new Keying Set, or just to add overrides here... */
|
||||||
ANIM_apply_keyingset(C, NULL, act, ks, MODIFYKEY_MODE_INSERT, (float)frame);
|
ANIM_apply_keyingset(C, NULL, act, ks, MODIFYKEY_MODE_INSERT, (float)frame);
|
||||||
|
|
||||||
/* store new 'active' pose number */
|
/* store new 'active' pose number */
|
||||||
@ -824,7 +824,7 @@ static void poselib_backup_restore(tPoseLib_PreviewData *pld)
|
|||||||
if (plb->oldprops)
|
if (plb->oldprops)
|
||||||
IDP_SyncGroupValues(plb->pchan->prop, plb->oldprops);
|
IDP_SyncGroupValues(plb->pchan->prop, plb->oldprops);
|
||||||
|
|
||||||
// TODO: constraints settings aren't restored yet, even though these could change (though not that likely)
|
/* TODO: constraints settings aren't restored yet, even though these could change (though not that likely) */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1663,6 +1663,6 @@ void POSELIB_OT_apply_pose(wmOperatorType *ot)
|
|||||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
// TODO: make the pose_index into a proper enum instead of a cryptic int...
|
/* TODO: make the pose_index into a proper enum instead of a cryptic int... */
|
||||||
ot->prop = RNA_def_int(ot->srna, "pose_index", -1, -2, INT_MAX, "Pose", "Index of the pose to apply (-2 for no change to pose, -1 for poselib active pose)", 0, INT_MAX);
|
ot->prop = RNA_def_int(ot->srna, "pose_index", -1, -2, INT_MAX, "Pose", "Index of the pose to apply (-2 for no change to pose, -1 for poselib active pose)", 0, INT_MAX);
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: disabled as this would otherwise cause a nasty loop...
|
/* XXX: disabled as this would otherwise cause a nasty loop... */
|
||||||
//ED_object_toggle_modes(C, ob->mode);
|
//ED_object_toggle_modes(C, ob->mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,7 +255,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op)
|
|||||||
CTX_DATA_END;
|
CTX_DATA_END;
|
||||||
|
|
||||||
/* calculate the bones that now have motionpaths... */
|
/* calculate the bones that now have motionpaths... */
|
||||||
// TODO: only make for the selected bones?
|
/* TODO: only make for the selected bones? */
|
||||||
ED_pose_recalculate_paths(scene, ob);
|
ED_pose_recalculate_paths(scene, ob);
|
||||||
|
|
||||||
/* notifiers for updates */
|
/* notifiers for updates */
|
||||||
@ -301,7 +301,7 @@ static int pose_update_paths_exec(bContext *C, wmOperator *UNUSED(op))
|
|||||||
return OPERATOR_CANCELLED;
|
return OPERATOR_CANCELLED;
|
||||||
|
|
||||||
/* calculate the bones that now have motionpaths... */
|
/* calculate the bones that now have motionpaths... */
|
||||||
// TODO: only make for the selected bones?
|
/* TODO: only make for the selected bones? */
|
||||||
ED_pose_recalculate_paths(scene, ob);
|
ED_pose_recalculate_paths(scene, ob);
|
||||||
|
|
||||||
/* notifiers for updates */
|
/* notifiers for updates */
|
||||||
|
@ -1764,7 +1764,7 @@ int filterSmartReebGraph(ReebGraph *UNUSED(rg), float UNUSED(threshold))
|
|||||||
ReebNode *removedNode = NULL;
|
ReebNode *removedNode = NULL;
|
||||||
int merging = 0;
|
int merging = 0;
|
||||||
|
|
||||||
// Assign terminal and middle nodes
|
/* Assign terminal and middle nodes */
|
||||||
if (arc->head->degree == 1) {
|
if (arc->head->degree == 1) {
|
||||||
terminalNode = arc->head;
|
terminalNode = arc->head;
|
||||||
middleNode = arc->tail;
|
middleNode = arc->tail;
|
||||||
@ -1774,30 +1774,30 @@ int filterSmartReebGraph(ReebGraph *UNUSED(rg), float UNUSED(threshold))
|
|||||||
middleNode = arc->head;
|
middleNode = arc->head;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If middle node is a normal node, merge to terminal node
|
/* If middle node is a normal node, merge to terminal node */
|
||||||
if (middleNode->degree == 2) {
|
if (middleNode->degree == 2) {
|
||||||
merging = 1;
|
merging = 1;
|
||||||
newNode = terminalNode;
|
newNode = terminalNode;
|
||||||
removedNode = middleNode;
|
removedNode = middleNode;
|
||||||
}
|
}
|
||||||
// Otherwise, just plain remove of the arc
|
/* Otherwise, just plain remove of the arc */
|
||||||
else {
|
else {
|
||||||
merging = 0;
|
merging = 0;
|
||||||
newNode = middleNode;
|
newNode = middleNode;
|
||||||
removedNode = terminalNode;
|
removedNode = terminalNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merging arc
|
/* Merging arc */
|
||||||
if (merging) {
|
if (merging) {
|
||||||
filterArc(rg, newNode, removedNode, arc, 1);
|
filterArc(rg, newNode, removedNode, arc, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// removing arc, so we need to decrease the degree of the remaining node
|
/* removing arc, so we need to decrease the degree of the remaining node
|
||||||
//newNode->degree--;
|
*newNode->degree--; */
|
||||||
NodeDegreeDecrement(rg, newNode);
|
NodeDegreeDecrement(rg, newNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset nextArc, it might have changed
|
/* Reset nextArc, it might have changed */
|
||||||
nextArc = arc->next;
|
nextArc = arc->next;
|
||||||
|
|
||||||
BLI_remlink(&rg->arcs, arc);
|
BLI_remlink(&rg->arcs, arc);
|
||||||
|
@ -215,16 +215,16 @@ static void update_string(Curve *cu)
|
|||||||
EditFont *ef = cu->editfont;
|
EditFont *ef = cu->editfont;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
// Free the old curve string
|
/* Free the old curve string */
|
||||||
MEM_freeN(cu->str);
|
MEM_freeN(cu->str);
|
||||||
|
|
||||||
// Calculate the actual string length in UTF-8 variable characters
|
/* Calculate the actual string length in UTF-8 variable characters */
|
||||||
len = BLI_wstrlen_utf8(ef->textbuf);
|
len = BLI_wstrlen_utf8(ef->textbuf);
|
||||||
|
|
||||||
// Alloc memory for UTF-8 variable char length string
|
/* Alloc memory for UTF-8 variable char length string */
|
||||||
cu->str = MEM_callocN(len + sizeof(wchar_t), "str");
|
cu->str = MEM_callocN(len + sizeof(wchar_t), "str");
|
||||||
|
|
||||||
// Copy the wchar to UTF-8
|
/* Copy the wchar to UTF-8 */
|
||||||
BLI_strncpy_wchar_as_utf8(cu->str, ef->textbuf, len + 1);
|
BLI_strncpy_wchar_as_utf8(cu->str, ef->textbuf, len + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,8 +362,8 @@ static int paste_file(bContext *C, ReportList *reports, const char *filename)
|
|||||||
|
|
||||||
strp = MEM_callocN(filelen + 4, "tempstr");
|
strp = MEM_callocN(filelen + 4, "tempstr");
|
||||||
|
|
||||||
// fread() instead of read(), because windows read() converts text
|
/* fread() instead of read(), because windows read() converts text
|
||||||
// to DOS \r\n linebreaks, causing double linebreaks in the 3d text
|
* to DOS \r\n linebreaks, causing double linebreaks in the 3d text */
|
||||||
filelen = fread(strp, 1, filelen, fp);
|
filelen = fread(strp, 1, filelen, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
strp[filelen] = 0;
|
strp[filelen] = 0;
|
||||||
@ -753,7 +753,7 @@ static int paste_selection(Object *obedit, ReportList *reports)
|
|||||||
EditFont *ef = cu->editfont;
|
EditFont *ef = cu->editfont;
|
||||||
int len = wcslen(ef->copybuf);
|
int len = wcslen(ef->copybuf);
|
||||||
|
|
||||||
// Verify that the copy buffer => [copy buffer len] + cu->len < MAXTEXT
|
/* Verify that the copy buffer => [copy buffer len] + cu->len < MAXTEXT */
|
||||||
if (cu->len + len <= MAXTEXT) {
|
if (cu->len + len <= MAXTEXT) {
|
||||||
if (len) {
|
if (len) {
|
||||||
int size = (cu->len * sizeof(wchar_t)) - (cu->pos * sizeof(wchar_t)) + sizeof(wchar_t);
|
int size = (cu->len * sizeof(wchar_t)) - (cu->pos * sizeof(wchar_t)) + sizeof(wchar_t);
|
||||||
@ -1452,7 +1452,7 @@ void make_editText(Object *obedit)
|
|||||||
ef->oldstrinfo = MEM_callocN((MAXTEXT + 4) * sizeof(CharInfo), "oldstrbuf");
|
ef->oldstrinfo = MEM_callocN((MAXTEXT + 4) * sizeof(CharInfo), "oldstrbuf");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert the original text to wchar_t
|
/* Convert the original text to wchar_t */
|
||||||
BLI_strncpy_wchar_from_utf8(ef->textbuf, cu->str, MAXTEXT + 4); /* length is bogus */
|
BLI_strncpy_wchar_from_utf8(ef->textbuf, cu->str, MAXTEXT + 4); /* length is bogus */
|
||||||
wcscpy(ef->oldstr, ef->textbuf);
|
wcscpy(ef->oldstr, ef->textbuf);
|
||||||
|
|
||||||
@ -1468,7 +1468,7 @@ void make_editText(Object *obedit)
|
|||||||
else
|
else
|
||||||
cu->curinfo = ef->textbufinfo[0];
|
cu->curinfo = ef->textbufinfo[0];
|
||||||
|
|
||||||
// Convert to UTF-8
|
/* Convert to UTF-8 */
|
||||||
update_string(cu);
|
update_string(cu);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1773,10 +1773,10 @@ static void *editFont_to_undoFont(void *ecu, void *UNUSED(obdata))
|
|||||||
EditFont *ef = cu->editfont;
|
EditFont *ef = cu->editfont;
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
// The undo buffer includes [MAXTEXT+6]=actual string and [MAXTEXT+4]*sizeof(CharInfo)=charinfo
|
/* The undo buffer includes [MAXTEXT+6]=actual string and [MAXTEXT+4]*sizeof(CharInfo)=charinfo */
|
||||||
str = MEM_callocN((MAXTEXT + 6) * sizeof(wchar_t) + (MAXTEXT + 4) * sizeof(CharInfo), "string undo");
|
str = MEM_callocN((MAXTEXT + 6) * sizeof(wchar_t) + (MAXTEXT + 4) * sizeof(CharInfo), "string undo");
|
||||||
|
|
||||||
// Copy the string and string information
|
/* Copy the string and string information */
|
||||||
memcpy(str + 4, ef->textbuf, (cu->len + 1) * sizeof(wchar_t));
|
memcpy(str + 4, ef->textbuf, (cu->len + 1) * sizeof(wchar_t));
|
||||||
memcpy(str + 4 + (cu->len + 1) * sizeof(wchar_t), ef->textbufinfo, cu->len * sizeof(CharInfo));
|
memcpy(str + 4 + (cu->len + 1) * sizeof(wchar_t), ef->textbufinfo, cu->len * sizeof(CharInfo));
|
||||||
|
|
||||||
|
@ -683,7 +683,7 @@ void draw_gpencil_2dimage(const bContext *C)
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* just draw using standard scaling (settings here are currently ignored anyways) */
|
/* just draw using standard scaling (settings here are currently ignored anyways) */
|
||||||
// FIXME: the opengl poly-strokes don't draw at right thickness when done this way, so disabled
|
/* FIXME: the opengl poly-strokes don't draw at right thickness when done this way, so disabled */
|
||||||
offsx = 0;
|
offsx = 0;
|
||||||
offsy = 0;
|
offsy = 0;
|
||||||
sizex = ar->winx;
|
sizex = ar->winx;
|
||||||
@ -740,7 +740,7 @@ void draw_gpencil_view2d(const bContext *C, short onlyv2d)
|
|||||||
if (gpd == NULL) return;
|
if (gpd == NULL) return;
|
||||||
|
|
||||||
/* special hack for Image Editor */
|
/* special hack for Image Editor */
|
||||||
// FIXME: the opengl poly-strokes don't draw at right thickness when done this way, so disabled
|
/* FIXME: the opengl poly-strokes don't draw at right thickness when done this way, so disabled */
|
||||||
if (ELEM(sa->spacetype, SPACE_IMAGE, SPACE_CLIP))
|
if (ELEM(sa->spacetype, SPACE_IMAGE, SPACE_CLIP))
|
||||||
dflag |= GP_DRAWDATA_IEDITHACK;
|
dflag |= GP_DRAWDATA_IEDITHACK;
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ bGPdata **gpencil_data_get_pointers(const bContext *C, PointerRNA *ptr)
|
|||||||
{
|
{
|
||||||
Object *ob = CTX_data_active_object(C);
|
Object *ob = CTX_data_active_object(C);
|
||||||
|
|
||||||
// TODO: we can include other data-types such as bones later if need be...
|
/* TODO: we can include other data-types such as bones later if need be... */
|
||||||
|
|
||||||
/* just in case no active object */
|
/* just in case no active object */
|
||||||
if (ob) {
|
if (ob) {
|
||||||
@ -126,7 +126,7 @@ bGPdata **gpencil_data_get_pointers(const bContext *C, PointerRNA *ptr)
|
|||||||
SpaceSeq *sseq = (SpaceSeq *)CTX_wm_space_data(C);
|
SpaceSeq *sseq = (SpaceSeq *)CTX_wm_space_data(C);
|
||||||
|
|
||||||
/* for now, Grease Pencil data is associated with the space (actually preview region only) */
|
/* for now, Grease Pencil data is associated with the space (actually preview region only) */
|
||||||
// XXX our convention for everything else is to link to data though...
|
/* XXX our convention for everything else is to link to data though... */
|
||||||
if (ptr) RNA_pointer_create(screen_id, &RNA_SpaceSequenceEditor, sseq, ptr);
|
if (ptr) RNA_pointer_create(screen_id, &RNA_SpaceSequenceEditor, sseq, ptr);
|
||||||
return &sseq->gpd;
|
return &sseq->gpd;
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ bGPdata **gpencil_data_get_pointers(const bContext *C, PointerRNA *ptr)
|
|||||||
SpaceImage *sima = (SpaceImage *)CTX_wm_space_data(C);
|
SpaceImage *sima = (SpaceImage *)CTX_wm_space_data(C);
|
||||||
|
|
||||||
/* for now, Grease Pencil data is associated with the space... */
|
/* for now, Grease Pencil data is associated with the space... */
|
||||||
// XXX our convention for everything else is to link to data though...
|
/* XXX our convention for everything else is to link to data though... */
|
||||||
if (ptr) RNA_pointer_create(screen_id, &RNA_SpaceImageEditor, sima, ptr);
|
if (ptr) RNA_pointer_create(screen_id, &RNA_SpaceImageEditor, sima, ptr);
|
||||||
return &sima->gpd;
|
return &sima->gpd;
|
||||||
}
|
}
|
||||||
|
@ -1624,10 +1624,10 @@ static int gpencil_draw_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
else
|
else
|
||||||
p = op->customdata;
|
p = op->customdata;
|
||||||
|
|
||||||
// TODO: set any additional settings that we can take from the events?
|
/* TODO: set any additional settings that we can take from the events?
|
||||||
// TODO? if tablet is erasing, force eraser to be on?
|
* TODO? if tablet is erasing, force eraser to be on? */
|
||||||
|
|
||||||
// TODO: move cursor setting stuff to stroke-start so that paintmode can be changed midway...
|
/* TODO: move cursor setting stuff to stroke-start so that paintmode can be changed midway... */
|
||||||
|
|
||||||
/* if eraser is on, draw radial aid */
|
/* if eraser is on, draw radial aid */
|
||||||
if (p->paintmode == GP_PAINTMODE_ERASER) {
|
if (p->paintmode == GP_PAINTMODE_ERASER) {
|
||||||
@ -1692,8 +1692,8 @@ static tGPsdata *gpencil_stroke_begin(bContext *C, wmOperator *op)
|
|||||||
//printf("\t\tGP - start stroke\n");
|
//printf("\t\tGP - start stroke\n");
|
||||||
|
|
||||||
/* we may need to set up paint env again if we're resuming */
|
/* we may need to set up paint env again if we're resuming */
|
||||||
// XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions
|
/* XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions */
|
||||||
// XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support
|
/* XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support */
|
||||||
|
|
||||||
if (gp_session_initdata(C, p))
|
if (gp_session_initdata(C, p))
|
||||||
gp_paint_initstroke(p, p->paintmode);
|
gp_paint_initstroke(p, p->paintmode);
|
||||||
@ -1727,17 +1727,17 @@ static int gpencil_draw_modal(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
tGPsdata *p = op->customdata;
|
tGPsdata *p = op->customdata;
|
||||||
int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
|
int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
|
||||||
|
|
||||||
// if (event->type == NDOF_MOTION)
|
/* if (event->type == NDOF_MOTION)
|
||||||
// return OPERATOR_PASS_THROUGH;
|
* return OPERATOR_PASS_THROUGH;
|
||||||
// -------------------------------
|
* -------------------------------
|
||||||
// [mce] Not quite what I was looking
|
* [mce] Not quite what I was looking
|
||||||
// for, but a good start! GP continues to
|
* for, but a good start! GP continues to
|
||||||
// draw on the screen while the 3D mouse
|
* draw on the screen while the 3D mouse
|
||||||
// moves the viewpoint. Problem is that
|
* moves the viewpoint. Problem is that
|
||||||
// the stroke is converted to 3D only after
|
* the stroke is converted to 3D only after
|
||||||
// it is finished. This approach should work
|
* it is finished. This approach should work
|
||||||
// better in tools that immediately apply
|
* better in tools that immediately apply
|
||||||
// in 3D space.
|
* in 3D space. */
|
||||||
|
|
||||||
//printf("\tGP - handle modal event...\n");
|
//printf("\tGP - handle modal event...\n");
|
||||||
|
|
||||||
|
@ -524,8 +524,8 @@ static void ui_draw_links(uiBlock *block)
|
|||||||
uiBut *but;
|
uiBut *but;
|
||||||
uiLinkLine *line;
|
uiLinkLine *line;
|
||||||
|
|
||||||
// Draw the inactive lines (lines with neither button being hovered over).
|
/* Draw the inactive lines (lines with neither button being hovered over).
|
||||||
// As we go, remember if we see any active or selected lines.
|
* As we go, remember if we see any active or selected lines. */
|
||||||
int foundselectline = 0;
|
int foundselectline = 0;
|
||||||
int foundactiveline = 0;
|
int foundactiveline = 0;
|
||||||
for (but = block->buttons.first; but; but = but->next) {
|
for (but = block->buttons.first; but; but = but->next) {
|
||||||
@ -542,8 +542,8 @@ static void ui_draw_links(uiBlock *block)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw any active lines (lines with either button being hovered over).
|
/* Draw any active lines (lines with either button being hovered over).
|
||||||
// Do this last so they appear on top of inactive lines.
|
* Do this last so they appear on top of inactive lines. */
|
||||||
if (foundactiveline) {
|
if (foundactiveline) {
|
||||||
for (but = block->buttons.first; but; but = but->next) {
|
for (but = block->buttons.first; but; but = but->next) {
|
||||||
if (but->type == LINK && but->link) {
|
if (but->type == LINK && but->link) {
|
||||||
@ -2486,7 +2486,7 @@ static void ui_block_do_align_but(uiBut *first, short nr)
|
|||||||
|
|
||||||
/* merge coordinates */
|
/* merge coordinates */
|
||||||
if (prev) {
|
if (prev) {
|
||||||
// simple cases
|
/* simple cases */
|
||||||
if (rows == 0) {
|
if (rows == 0) {
|
||||||
but->x1 = (prev->x2 + but->x1) / 2.0f;
|
but->x1 = (prev->x2 + but->x1) / 2.0f;
|
||||||
prev->x2 = but->x1;
|
prev->x2 = but->x1;
|
||||||
@ -3432,7 +3432,7 @@ int uiButGetUnitType(uiBut *but)
|
|||||||
/* own unit define always takes precedence over RNA provided, allowing for overriding
|
/* own unit define always takes precedence over RNA provided, allowing for overriding
|
||||||
* default value provided in RNA in a few special cases (i.e. Active Keyframe in Graph Edit)
|
* default value provided in RNA in a few special cases (i.e. Active Keyframe in Graph Edit)
|
||||||
*/
|
*/
|
||||||
// XXX: this doesn't allow clearing unit completely, though the same could be said for icons
|
/* XXX: this doesn't allow clearing unit completely, though the same could be said for icons */
|
||||||
if ((ownUnit != 0) || (but->rnaprop == NULL)) {
|
if ((ownUnit != 0) || (but->rnaprop == NULL)) {
|
||||||
return ownUnit << 16;
|
return ownUnit << 16;
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,7 @@ int ui_but_anim_expression_create(uiBut *but, const char *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* make sure we have animdata for this */
|
/* make sure we have animdata for this */
|
||||||
// FIXME: until materials can be handled by depsgraph, don't allow drivers to be created for them
|
/* FIXME: until materials can be handled by depsgraph, don't allow drivers to be created for them */
|
||||||
id = (ID *)but->rnapoin.id.data;
|
id = (ID *)but->rnapoin.id.data;
|
||||||
if ((id == NULL) || (GS(id->name) == ID_MA) || (GS(id->name) == ID_TE)) {
|
if ((id == NULL) || (GS(id->name) == ID_MA) || (GS(id->name) == ID_TE)) {
|
||||||
if (G.debug & G_DEBUG)
|
if (G.debug & G_DEBUG)
|
||||||
@ -162,7 +162,7 @@ int ui_but_anim_expression_create(uiBut *but, const char *str)
|
|||||||
driver->type = DRIVER_TYPE_PYTHON;
|
driver->type = DRIVER_TYPE_PYTHON;
|
||||||
|
|
||||||
/* set the expression */
|
/* set the expression */
|
||||||
// TODO: need some way of identifying variables used
|
/* TODO: need some way of identifying variables used */
|
||||||
BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression));
|
BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression));
|
||||||
|
|
||||||
/* updates */
|
/* updates */
|
||||||
@ -188,7 +188,7 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
|
|||||||
if (fcu && !driven) {
|
if (fcu && !driven) {
|
||||||
id = but->rnapoin.id.data;
|
id = but->rnapoin.id.data;
|
||||||
|
|
||||||
// TODO: this should probably respect the keyingset only option for anim
|
/* TODO: this should probably respect the keyingset only option for anim */
|
||||||
if (autokeyframe_cfra_can_key(scene, id)) {
|
if (autokeyframe_cfra_can_key(scene, id)) {
|
||||||
ReportList *reports = CTX_wm_reports(C);
|
ReportList *reports = CTX_wm_reports(C);
|
||||||
short flag = ANIM_get_keyframing_flags(scene, 1);
|
short flag = ANIM_get_keyframing_flags(scene, 1);
|
||||||
|
@ -441,7 +441,7 @@ void ui_draw_but_IMAGE(ARegion *UNUSED(ar), uiBut *but, uiWidgetColors *UNUSED(w
|
|||||||
|
|
||||||
w = (rect->xmax - rect->xmin);
|
w = (rect->xmax - rect->xmin);
|
||||||
h = (rect->ymax - rect->ymin);
|
h = (rect->ymax - rect->ymin);
|
||||||
// prevent drawing outside widget area
|
/* prevent drawing outside widget area */
|
||||||
glGetIntegerv(GL_SCISSOR_BOX, scissor);
|
glGetIntegerv(GL_SCISSOR_BOX, scissor);
|
||||||
glScissor(ar->winrct.xmin + rect->xmin, ar->winrct.ymin + rect->ymin, w, h);
|
glScissor(ar->winrct.xmin + rect->xmin, ar->winrct.ymin + rect->ymin, w, h);
|
||||||
#endif
|
#endif
|
||||||
@ -509,7 +509,7 @@ static void ui_draw_but_CHARTAB(uiBut *but)
|
|||||||
|
|
||||||
/* Set the font, in case it is not FO_BUILTIN_NAME font */
|
/* Set the font, in case it is not FO_BUILTIN_NAME font */
|
||||||
if (G.selfont && strcmp(G.selfont->name, FO_BUILTIN_NAME)) {
|
if (G.selfont && strcmp(G.selfont->name, FO_BUILTIN_NAME)) {
|
||||||
// Is the font file packed, if so then use the packed file
|
/* Is the font file packed, if so then use the packed file */
|
||||||
if (G.selfont->packedfile) {
|
if (G.selfont->packedfile) {
|
||||||
pf = G.selfont->packedfile;
|
pf = G.selfont->packedfile;
|
||||||
FTF_SetFont(pf->data, pf->size, 14.0);
|
FTF_SetFont(pf->data, pf->size, 14.0);
|
||||||
@ -537,15 +537,15 @@ static void ui_draw_but_CHARTAB(uiBut *but)
|
|||||||
|
|
||||||
glColor3ub(0, 0, 0);
|
glColor3ub(0, 0, 0);
|
||||||
for (y = 0; y < 6; y++) {
|
for (y = 0; y < 6; y++) {
|
||||||
// Do not draw more than the category allows
|
/* Do not draw more than the category allows */
|
||||||
if (cs > charmax) break;
|
if (cs > charmax) break;
|
||||||
|
|
||||||
for (x = 0; x < 12; x++)
|
for (x = 0; x < 12; x++)
|
||||||
{
|
{
|
||||||
// Do not draw more than the category allows
|
/* Do not draw more than the category allows */
|
||||||
if (cs > charmax) break;
|
if (cs > charmax) break;
|
||||||
|
|
||||||
// Draw one grid cell
|
/* Draw one grid cell */
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
glVertex2f(sx, sy);
|
glVertex2f(sx, sy);
|
||||||
glVertex2f(ex, sy);
|
glVertex2f(ex, sy);
|
||||||
@ -553,11 +553,11 @@ static void ui_draw_but_CHARTAB(uiBut *but)
|
|||||||
glVertex2f(sx, ey);
|
glVertex2f(sx, ey);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
// Draw character inside the cell
|
/* Draw character inside the cell */
|
||||||
memset(wstr, 0, sizeof(wchar_t) * 2);
|
memset(wstr, 0, sizeof(wchar_t) * 2);
|
||||||
memset(ustr, 0, 16);
|
memset(ustr, 0, 16);
|
||||||
|
|
||||||
// Set the font to be either unicode or FO_BUILTIN_NAME
|
/* Set the font to be either unicode or FO_BUILTIN_NAME */
|
||||||
wstr[0] = cs;
|
wstr[0] = cs;
|
||||||
if (strcmp(G.selfont->name, FO_BUILTIN_NAME)) {
|
if (strcmp(G.selfont->name, FO_BUILTIN_NAME)) {
|
||||||
BLI_strncpy_wchar_as_utf8((char *)ustr, (wchar_t *)wstr, sizeof(ustr));
|
BLI_strncpy_wchar_as_utf8((char *)ustr, (wchar_t *)wstr, sizeof(ustr));
|
||||||
@ -580,17 +580,17 @@ static void ui_draw_but_CHARTAB(uiBut *but)
|
|||||||
float dx, dy;
|
float dx, dy;
|
||||||
float px, py;
|
float px, py;
|
||||||
|
|
||||||
// Calculate the position
|
/* Calculate the position */
|
||||||
wid = FTF_GetStringWidth((char *) ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
|
wid = FTF_GetStringWidth((char *) ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
|
||||||
FTF_GetBoundingBox((char *) ustr, &llx, &lly, &llz, &urx, &ury, &urz, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
|
FTF_GetBoundingBox((char *) ustr, &llx, &lly, &llz, &urx, &ury, &urz, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
|
||||||
dx = urx - llx;
|
dx = urx - llx;
|
||||||
dy = ury - lly;
|
dy = ury - lly;
|
||||||
|
|
||||||
// This isn't fully functional since the but->aspect isn't working like I suspected
|
/* This isn't fully functional since the but->aspect isn't working like I suspected */
|
||||||
px = sx + ((butw / but->aspect) - dx) / 2;
|
px = sx + ((butw / but->aspect) - dx) / 2;
|
||||||
py = sy + ((buth / but->aspect) - dy) / 2;
|
py = sy + ((buth / but->aspect) - dy) / 2;
|
||||||
|
|
||||||
// Set the position and draw the character
|
/* Set the position and draw the character */
|
||||||
ui_rasterpos_safe(px, py, but->aspect);
|
ui_rasterpos_safe(px, py, but->aspect);
|
||||||
FTF_DrawString((char *) ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
|
FTF_DrawString((char *) ustr, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
|
||||||
}
|
}
|
||||||
@ -599,7 +599,7 @@ static void ui_draw_but_CHARTAB(uiBut *but)
|
|||||||
UI_DrawString(but->font, (char *) ustr, 0);
|
UI_DrawString(but->font, (char *) ustr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the next position and character
|
/* Calculate the next position and character */
|
||||||
sx += butw; ex += butw;
|
sx += butw; ex += butw;
|
||||||
cs++;
|
cs++;
|
||||||
}
|
}
|
||||||
@ -1571,9 +1571,9 @@ void ui_draw_but_TRACKPREVIEW(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wc
|
|||||||
if (tmpibuf->rect_float)
|
if (tmpibuf->rect_float)
|
||||||
IMB_rect_from_float(tmpibuf);
|
IMB_rect_from_float(tmpibuf);
|
||||||
|
|
||||||
// XXX: for debug only
|
/* XXX: for debug only
|
||||||
// tmpibuf->ftype = PNG;
|
* tmpibuf->ftype = PNG;
|
||||||
// IMB_saveiff(tmpibuf, "sample.png", IB_rect);
|
* IMB_saveiff(tmpibuf, "sample.png", IB_rect); */
|
||||||
|
|
||||||
if (tmpibuf->rect)
|
if (tmpibuf->rect)
|
||||||
scopes->track_preview = tmpibuf;
|
scopes->track_preview = tmpibuf;
|
||||||
|
@ -804,7 +804,7 @@ static void ui_add_smart_controller(bContext *C, uiBut *from, uiBut *to)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// only works if the sensor and the actuator are from the same object
|
/* only works if the sensor and the actuator are from the same object */
|
||||||
if (!act_iter) return;
|
if (!act_iter) return;
|
||||||
|
|
||||||
/* (3) add a new controller */
|
/* (3) add a new controller */
|
||||||
@ -3478,13 +3478,13 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
|
|||||||
else if (event->type == WHEELDOWNMOUSE) {
|
else if (event->type == WHEELDOWNMOUSE) {
|
||||||
float *hsv = ui_block_hsv_get(but->block);
|
float *hsv = ui_block_hsv_get(but->block);
|
||||||
hsv[2] = CLAMPIS(hsv[2] - 0.05f, 0.0f, 1.0f);
|
hsv[2] = CLAMPIS(hsv[2] - 0.05f, 0.0f, 1.0f);
|
||||||
ui_set_but_hsv(but); // converts to rgb
|
ui_set_but_hsv(but); /* converts to rgb */
|
||||||
ui_numedit_apply(C, block, but, data);
|
ui_numedit_apply(C, block, but, data);
|
||||||
}
|
}
|
||||||
else if (event->type == WHEELUPMOUSE) {
|
else if (event->type == WHEELUPMOUSE) {
|
||||||
float *hsv = ui_block_hsv_get(but->block);
|
float *hsv = ui_block_hsv_get(but->block);
|
||||||
hsv[2] = CLAMPIS(hsv[2] + 0.05f, 0.0f, 1.0f);
|
hsv[2] = CLAMPIS(hsv[2] + 0.05f, 0.0f, 1.0f);
|
||||||
ui_set_but_hsv(but); // converts to rgb
|
ui_set_but_hsv(but); /* converts to rgb */
|
||||||
ui_numedit_apply(C, block, but, data);
|
ui_numedit_apply(C, block, but, data);
|
||||||
}
|
}
|
||||||
else if (event->type == MOUSEMOVE) {
|
else if (event->type == MOUSEMOVE) {
|
||||||
@ -3810,7 +3810,7 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt
|
|||||||
|
|
||||||
static int in_scope_resize_zone(uiBut *but, int UNUSED(x), int y)
|
static int in_scope_resize_zone(uiBut *but, int UNUSED(x), int y)
|
||||||
{
|
{
|
||||||
// bottom corner return (x > but->x2 - SCOPE_RESIZE_PAD) && (y < but->y1 + SCOPE_RESIZE_PAD);
|
/* bottom corner return (x > but->x2 - SCOPE_RESIZE_PAD) && (y < but->y1 + SCOPE_RESIZE_PAD); */
|
||||||
return (y < but->y1 + SCOPE_RESIZE_PAD);
|
return (y < but->y1 + SCOPE_RESIZE_PAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3833,7 +3833,7 @@ static int ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* scale histogram values */
|
/* scale histogram values */
|
||||||
const float yfac = MIN2(powf(hist->ymax, 2.f), 1.f) * 0.5f;
|
const float yfac = minf(powf(hist->ymax, 2.0f), 1.0f) * 0.5f;
|
||||||
hist->ymax += dy * yfac;
|
hist->ymax += dy * yfac;
|
||||||
|
|
||||||
CLAMP(hist->ymax, 1.f, 100.f);
|
CLAMP(hist->ymax, 1.f, 100.f);
|
||||||
@ -4505,7 +4505,7 @@ static int ui_but_menu(bContext *C, uiBut *but)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Keying Sets */
|
/* Keying Sets */
|
||||||
// TODO: check on modifyability of Keying Set when doing this
|
/* TODO: check on modifyability of Keying Set when doing this */
|
||||||
if (is_anim) {
|
if (is_anim) {
|
||||||
uiItemS(layout);
|
uiItemS(layout);
|
||||||
|
|
||||||
@ -4529,8 +4529,8 @@ static int ui_but_menu(bContext *C, uiBut *but)
|
|||||||
|
|
||||||
/* Property Operators */
|
/* Property Operators */
|
||||||
|
|
||||||
//Copy Property Value
|
/*Copy Property Value
|
||||||
//Paste Property Value
|
*Paste Property Value */
|
||||||
|
|
||||||
if (length) {
|
if (length) {
|
||||||
uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset All to Default Values"),
|
uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset All to Default Values"),
|
||||||
@ -4566,7 +4566,7 @@ static int ui_but_menu(bContext *C, uiBut *but)
|
|||||||
/* keyboard shortcuts */
|
/* keyboard shortcuts */
|
||||||
if ((kmi) && ISKEYBOARD(kmi->type)) {
|
if ((kmi) && ISKEYBOARD(kmi->type)) {
|
||||||
|
|
||||||
// would rather use a block but, but gets weirdly positioned...
|
/* would rather use a block but, but gets weirdly positioned... */
|
||||||
//uiDefBlockBut(block, menu_change_shortcut, but, "Change Shortcut", 0, 0, uiLayoutGetWidth(layout), UI_UNIT_Y, "");
|
//uiDefBlockBut(block, menu_change_shortcut, but, "Change Shortcut", 0, 0, uiLayoutGetWidth(layout), UI_UNIT_Y, "");
|
||||||
|
|
||||||
but2 = uiDefIconTextBut(block, BUT, 0, 0, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Change Shortcut"),
|
but2 = uiDefIconTextBut(block, BUT, 0, 0, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Change Shortcut"),
|
||||||
|
@ -1454,21 +1454,21 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
|
|||||||
|
|
||||||
/* when you are outside parent button, safety there should be smaller */
|
/* when you are outside parent button, safety there should be smaller */
|
||||||
|
|
||||||
// parent button to left
|
/* parent button to left */
|
||||||
if (midx < block->minx) block->safety.xmin = block->minx - 3;
|
if (midx < block->minx) block->safety.xmin = block->minx - 3;
|
||||||
else block->safety.xmin = block->minx - 40;
|
else block->safety.xmin = block->minx - 40;
|
||||||
// parent button to right
|
/* parent button to right */
|
||||||
if (midx > block->maxx) block->safety.xmax = block->maxx + 3;
|
if (midx > block->maxx) block->safety.xmax = block->maxx + 3;
|
||||||
else block->safety.xmax = block->maxx + 40;
|
else block->safety.xmax = block->maxx + 40;
|
||||||
|
|
||||||
// parent button on bottom
|
/* parent button on bottom */
|
||||||
if (midy < block->miny) block->safety.ymin = block->miny - 3;
|
if (midy < block->miny) block->safety.ymin = block->miny - 3;
|
||||||
else block->safety.ymin = block->miny - 40;
|
else block->safety.ymin = block->miny - 40;
|
||||||
// parent button on top
|
/* parent button on top */
|
||||||
if (midy > block->maxy) block->safety.ymax = block->maxy + 3;
|
if (midy > block->maxy) block->safety.ymax = block->maxy + 3;
|
||||||
else block->safety.ymax = block->maxy + 40;
|
else block->safety.ymax = block->maxy + 40;
|
||||||
|
|
||||||
// exception for switched pulldowns...
|
/* exception for switched pulldowns... */
|
||||||
if (dir1 && (dir1 & block->direction) == 0) {
|
if (dir1 && (dir1 & block->direction) == 0) {
|
||||||
if (dir2 == UI_RIGHT) block->safety.xmax = block->maxx + 3;
|
if (dir2 == UI_RIGHT) block->safety.xmax = block->maxx + 3;
|
||||||
if (dir2 == UI_LEFT) block->safety.xmin = block->minx - 3;
|
if (dir2 == UI_LEFT) block->safety.xmin = block->minx - 3;
|
||||||
@ -1862,7 +1862,7 @@ static void ui_update_block_buts_rgb(uiBlock *block, const float rgb[3])
|
|||||||
*/
|
*/
|
||||||
rgb_to_hsv_compat_v(rgb, hsv);
|
rgb_to_hsv_compat_v(rgb, hsv);
|
||||||
|
|
||||||
// this updates button strings, is hackish... but button pointers are on stack of caller function
|
/* this updates button strings, is hackish... but button pointers are on stack of caller function */
|
||||||
for (bt = block->buttons.first; bt; bt = bt->next) {
|
for (bt = block->buttons.first; bt; bt = bt->next) {
|
||||||
if (bt->rnaprop) {
|
if (bt->rnaprop) {
|
||||||
|
|
||||||
@ -2130,8 +2130,8 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper
|
|||||||
bt = uiDefButR_prop(block, NUMSLI, 0, IFACE_("B "), 0, -100, butwidth, UI_UNIT_Y, ptr, prop, 2, 0.0, 0.0, 0, 3, TIP_("Blue"));
|
bt = uiDefButR_prop(block, NUMSLI, 0, IFACE_("B "), 0, -100, butwidth, UI_UNIT_Y, ptr, prop, 2, 0.0, 0.0, 0, 3, TIP_("Blue"));
|
||||||
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
|
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
|
||||||
|
|
||||||
// could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", ICON_NONE);
|
/* could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", ICON_NONE);
|
||||||
// but need to use uiButSetFunc for updating other fake buttons
|
* but need to use uiButSetFunc for updating other fake buttons */
|
||||||
|
|
||||||
/* HSV values */
|
/* HSV values */
|
||||||
uiBlockBeginAlign(block);
|
uiBlockBeginAlign(block);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user