Example #1
0
float rayIntersectDisk(ShadeRec* sr, Disk* disk, const Ray ray)
{
    vec3 displacement;
    vec3_sub(displacement, disk->center, ray.origin);
    float t = vec3_dot(displacement, disk->normal) / vec3_dot(ray.direction, disk->normal);
    if(t > K_EPSILON)
    {
        vec3 hit_point;
        getPointOnRay(hit_point, ray, t);
        vec3_sub(displacement, hit_point, disk->center);
        if(vec3_length(displacement) <= disk->radius)
        {
            vec3_negate(sr->wo, ray.direction);
            if(vec3_dot(sr->wo, disk->normal) < 0)
            {
                vec3_negate(sr->wo, disk->normal);
            }else
            {
                vec3_copy(sr->normal, disk->normal);
            }
            vec3_copy(sr->hit_point, hit_point);
            sr->mat = *(disk->mat);
            return t;
        }
    }
    return TMAX;
}
Example #2
0
void calc_torque(struct vec3 *dst, const struct vec3 *v1,
                 const struct vec3 *v2, float torque, float min_adjust,
                 float t)
{
    struct vec3 line, dir;
    float orig_dist, torque_dist, adjust_dist;

    if (vec3_close(v1, v2, EPSILON)) {
        vec3_copy(dst, v1);
        return;
    }

    vec3_sub(&line, v2, v1);
    orig_dist = vec3_len(&line);
    vec3_mulf(&dir, &line, 1.0f/orig_dist);

    torque_dist = orig_dist*torque; /* use distance to determine speed */
    if (torque_dist < min_adjust)   /* prevent from going too slow */
        torque_dist = min_adjust;

    adjust_dist = torque_dist*t;

    if (adjust_dist <= (orig_dist-LARGE_EPSILON)) {
        vec3_mulf(dst, &dir, adjust_dist);
        vec3_add(dst, dst, v1); /* add torque */
    } else {
        vec3_copy(dst, v2);     /* clamp if overshoot */
    }
}
static bool AddItemBounds(obs_scene_t scene, obs_sceneitem_t item,
		void *param)
{
	SelectedItemBounds *data = reinterpret_cast<SelectedItemBounds*>(param);

	if (!obs_sceneitem_selected(item))
		return true;

	matrix4 boxTransform;
	obs_sceneitem_get_box_transform(item, &boxTransform);

	vec3 t[4] = {
		GetTransformedPos(0.0f, 0.0f, boxTransform),
		GetTransformedPos(1.0f, 0.0f, boxTransform),
		GetTransformedPos(0.0f, 1.0f, boxTransform),
		GetTransformedPos(1.0f, 1.0f, boxTransform)
	};

	for (const vec3 &v : t) {
		if (data->first) {
			vec3_copy(&data->tl, &v);
			vec3_copy(&data->br, &v);
			data->first = false;
		} else {
			vec3_min(&data->tl, &data->tl, &v);
			vec3_max(&data->br, &data->br, &v);
		}
	}

	UNUSED_PARAMETER(scene);
	return true;
}
void OBSBasicPreview::SnapStretchingToScreen(vec3 &tl, vec3 &br)
{
	uint32_t stretchFlags = (uint32_t)stretchHandle;
	vec3     newTL        = GetTransformedPos(tl.x, tl.y, itemToScreen);
	vec3     newTR        = GetTransformedPos(br.x, tl.y, itemToScreen);
	vec3     newBL        = GetTransformedPos(tl.x, br.y, itemToScreen);
	vec3     newBR        = GetTransformedPos(br.x, br.y, itemToScreen);
	vec3     boundingTL;
	vec3     boundingBR;

	vec3_copy(&boundingTL, &newTL);
	vec3_min(&boundingTL, &boundingTL, &newTR);
	vec3_min(&boundingTL, &boundingTL, &newBL);
	vec3_min(&boundingTL, &boundingTL, &newBR);

	vec3_copy(&boundingBR, &newTL);
	vec3_max(&boundingBR, &boundingBR, &newTR);
	vec3_max(&boundingBR, &boundingBR, &newBL);
	vec3_max(&boundingBR, &boundingBR, &newBR);

	vec3 offset = GetScreenSnapOffset(boundingTL, boundingBR);
	vec3_add(&offset, &offset, &newTL);
	vec3_transform(&offset, &offset, &screenToItem);
	vec3_sub(&offset, &offset, &tl);

	if (stretchFlags & ITEM_LEFT)
		tl.x += offset.x;
	else if (stretchFlags & ITEM_RIGHT)
		br.x += offset.x;

	if (stretchFlags & ITEM_TOP)
		tl.y += offset.y;
	else if (stretchFlags & ITEM_BOTTOM)
		br.y += offset.y;
}
Example #5
0
t_material		*create_material(const char *name, const t_vec3 *ambient, const t_vec3 *diffuse, const t_vec3 *specular)
{
	t_material	*material;

	material = (t_material*)calloc(1, sizeof(t_material));
	material->name = ft_strdup(name);
	vec3_copy(&material->ambient, ambient);
	vec3_copy(&material->diffuse, diffuse);
	vec3_copy(&material->specular, specular);
	return (material);
}
Example #6
0
static void	set_ray_direction(t_ray *ray, const t_camera *camera, float increment_x, float increment_y)
{
	t_vec3	dest;

	vec3_copy(&dest, &camera->viewplane.upleft);
	dest.x += increment_x;
	dest.y -= increment_y;

	vec3_copy(&ray->direction, &dest);
	vec3_sub(&ray->direction, &ray->origin);
	vec3_normalize(&ray->direction);
}
Example #7
0
/*
Create a new buffer object from an array of vec3s for pts, and vec3s for texture coordinates.
Faces is an array of 3 shorts for each face.
*/
BUFFER_T *buffer_new(float pts[][3], float tex[][3], short faces[][3], int numpts, int numfaces)
{
    int i;
    float normals[numpts][3];
    BUFFER_T *buf;
    NEW(buf);

    for(i=0; i<numpts; i++)
    {
        normals[i][0]=0;
        normals[i][1]=0;
        normals[i][2]=1;
    }
    for(i=0; i<numfaces; i++)
    {
        int a = faces[i][0];
        int b = faces[i][1];
        int c = faces[i][2];
        float tmp[3];
        float tmp2[3];
        float n[3];
        vec3_sub(tmp,pts[b],pts[a]);
        vec3_sub(tmp2,pts[c],pts[a]);
        vec3_cross(n,tmp,tmp2);
        vec3_normal(n,n);
        vec3_copy(normals[a],n);
        vec3_copy(normals[b],n);
        vec3_copy(normals[c],n);
    }
    float B[3*3*numpts];
    for(i=0; i<numpts; i++)
    {
        for(int j=0; j<3; j++)
        {
            B[i*3*3+j]=pts[i][j];
            B[i*3*3+3+j]=tex[i][j];
            B[i*3*3+6+j]=normals[i][j];
        }
    }

    buf->ntris=numfaces;
    glGenBuffers(1,&buf->vbuf);
    glBindBuffer(GL_ARRAY_BUFFER, buf->vbuf);
    glBufferData(GL_ARRAY_BUFFER, 36*numpts, B, GL_STATIC_DRAW);
    buf->vbuf_num = numpts;

    glGenBuffers(1,&buf->ebuf);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf->ebuf);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6*numfaces, faces, GL_STATIC_DRAW);
    buf->ebuf_num = numfaces*3;

    return buf;
}
Example #8
0
File: vec.c Project: imeteora/goxel
void mat3_to_eul(const float m[3][3], int order, float e[3])
{
    float e1[3], e2[3];
    mat3_to_eul2(m, order, e1, e2);

    // Pick best.
    if (    fabs(e1[0]) + fabs(e1[1]) + fabs(e1[2]) >
            fabs(e2[0]) + fabs(e2[1]) + fabs(e2[2])) {
        vec3_copy(e2, e);
    } else {
        vec3_copy(e1, e);
    }
}
Example #9
0
void BoneFrame_Copy(bone_frame_p dst, const bone_frame_p src)
{
    if(dst->bone_tag_count < src->bone_tag_count)
    {
        dst->bone_tags = (bone_tag_p)realloc(dst->bone_tags, src->bone_tag_count * sizeof(bone_tag_t));
    }
    dst->bone_tag_count = src->bone_tag_count;
    vec3_copy(dst->pos, src->pos);
    vec3_copy(dst->centre, src->centre);
    vec3_copy(dst->bb_max, src->bb_max);
    vec3_copy(dst->bb_min, src->bb_min);
    memcpy(dst->bone_tags, src->bone_tags, src->bone_tag_count * sizeof(struct bone_tag_s));
}
Example #10
0
void Sector_LowestCeilingCorner(room_sector_p rs, float v[3])
{
    float *r1 = (rs->ceiling_corners[0][2] > rs->ceiling_corners[1][2])?(rs->ceiling_corners[0]):(rs->ceiling_corners[1]);
    float *r2 = (rs->ceiling_corners[2][2] > rs->ceiling_corners[3][2])?(rs->ceiling_corners[2]):(rs->ceiling_corners[3]);

    if(r1[2] < r2[2])
    {
        vec3_copy(v, r1);
    }
    else
    {
        vec3_copy(v, r2);
    }
}
Example #11
0
void Sector_HighestFloorCorner(room_sector_p rs, float v[3])
{
    float *r1 = (rs->floor_corners[0][2] > rs->floor_corners[1][2])?(rs->floor_corners[0]):(rs->floor_corners[1]);
    float *r2 = (rs->floor_corners[2][2] > rs->floor_corners[3][2])?(rs->floor_corners[2]):(rs->floor_corners[3]);

    if(r1[2] > r2[2])
    {
        vec3_copy(v, r1);
    }
    else
    {
        vec3_copy(v, r2);
    }
}
Example #12
0
void SSBoneFrame_FillSkinnedMeshMap(ss_bone_frame_p bf)
{
    uint32_t *ch;
    uint32_t founded_index = 0xFFFFFFFF;
    float tv[3];
    vertex_p v, founded_vertex;
    base_mesh_p mesh_base, mesh_skin;
    ss_bone_tag_p tree_tag = bf->bone_tags;

    for(uint16_t i = 0; i < bf->bone_tag_count; i++, tree_tag++)
    {
        if(!tree_tag->mesh_skin)
        {
            continue;
        }
        if(tree_tag->skin_map)
        {
            free(tree_tag->skin_map);
            tree_tag->skin_map = NULL;
        }
        mesh_base = tree_tag->mesh_base;
        mesh_skin = tree_tag->mesh_skin;
        ch = tree_tag->skin_map = (uint32_t*)malloc(mesh_skin->vertex_count * sizeof(uint32_t));
        v = mesh_skin->vertices;
        for(uint32_t k = 0; k < mesh_skin->vertex_count; k++, v++, ch++)
        {
            *ch = 0xFFFFFFFF;
            founded_index = BaseMesh_FindVertexIndex(mesh_base, v->position);
            if(founded_index != 0xFFFFFFFF)
            {
                founded_vertex = mesh_base->vertices + founded_index;
                vec3_copy(v->position, founded_vertex->position);
                vec3_copy(v->normal, founded_vertex->normal);
            }
            else if(tree_tag->parent)
            {
                vec3_add(tv, v->position, tree_tag->offset);
                founded_index = BaseMesh_FindVertexIndex(tree_tag->parent->mesh_base, tv);
                if(founded_index != 0xFFFFFFFF)
                {
                    founded_vertex = tree_tag->parent->mesh_base->vertices + founded_index;
                    *ch = founded_index;
                    vec3_sub(v->position, founded_vertex->position, tree_tag->offset);
                    vec3_copy(v->normal, founded_vertex->normal);
                }
            }
        }
    }
}
Example #13
0
File: vec.c Project: imeteora/goxel
void mat3_to_eul2(const float m[3][3], int order, float e1[3], float e2[3])
{

    const int *r = EUL_ORDERS[order];
    int i = r[0], j = r[1], k = r[2];
    int parity = r[3];
    float cy = hypot(m[i][i], m[i][j]);
    float n[3][3];

    mat3_normalize_(m, n);
    if (cy > 16.0f * FLT_EPSILON) {
        e1[i] = atan2(m[j][k], m[k][k]);
        e1[j] = atan2(-m[i][k], cy);
        e1[k] = atan2(m[i][j], m[i][i]);
        e2[i] = atan2(-m[j][k], -m[k][k]);
        e2[j] = atan2(-m[i][k], -cy);
        e2[k] = atan2(-m[i][j], -m[i][i]);
    } else {
        e1[i] = atan2(-m[k][j], m[j][j]);
        e1[j] = atan2(-m[i][k], cy);
        e1[k] = 0.0;
        vec3_copy(e1, e2);
    }
    if (parity) {
        vec3_imul(e1, -1);
        vec3_imul(e2, -1);
    }
}
Example #14
0
File: bullet.c Project: lcthums/C3D
bullet* bullet_create(vec3 position, vec3 direction, bulletType *specs) {
	bullet* ret = (bullet*)malloc(sizeof(bullet));
	
	ret->specs = specs;
	ret->distanceTraveled = 0;
	vec3_copy(ret->direction, direction);
	vec3_copy(ret->position, position);
	ret->frameDistance = ret->specs->speed * sqrt(ret->direction[0]*ret->direction[0] + ret->direction[1]*ret->direction[1] + ret->direction[2]*ret->direction[2]);

	ret->model = (mesh*)malloc(sizeof(mesh));
	memcpy(ret->model, ret->specs->model, sizeof(mesh));

	mesh_translate(ret->model, position[0], position[1], position[2]);

	return ret;
}
Example #15
0
int		raycast_to_sphere(t_hit *hit, const t_ray *ray, const t_sphere *sphere)
{
	t_vec3	distance_to_center;
	float	tca;
	float	d2;
	float	thc;

	vec3_copy(&distance_to_center, &sphere->position);
	vec3_sub(&distance_to_center, &ray->origin);
	tca = vec3_dot(&distance_to_center, &ray->direction);

	if (tca < 0)
		return (0);

	d2 = vec3_dot(&distance_to_center, &distance_to_center) - tca * tca;

	if (d2 > sphere->radius * sphere->radius)
		return (0);

	thc = sqrt(sphere->radius * sphere->radius - d2);
	hit->distance = select_closest_hit(tca - thc, tca + thc);

	update_hit_from_ray(hit, ray, &sphere->material->ambient);

	return (1);
}
Example #16
0
void SSBoneFrame_CreateFromModel(ss_bone_frame_p bf, skeletal_model_p model)
{
    vec3_set_zero(bf->bb_min);
    vec3_set_zero(bf->bb_max);
    vec3_set_zero(bf->centre);
    vec3_set_zero(bf->pos);
    bf->animations.type = ANIM_TYPE_BASE;
    bf->animations.anim_frame_flags = 0x0000;
    bf->animations.anim_ext_flags = 0x0000;
    bf->animations.frame_time = 0.0;
    bf->animations.period = 1.0 / 30.0;
    bf->animations.next_state = 0;
    bf->animations.lerp = 0.0;
    bf->animations.current_animation = 0;
    bf->animations.current_frame = 0;
    bf->animations.next_animation = 0;
    bf->animations.next_frame = 0;
    vec3_set_zero(bf->animations.target);
    bf->animations.bone_direction[0] = 0.0f;
    bf->animations.bone_direction[1] = 1.0f;
    bf->animations.bone_direction[2] = 0.0f;
    bf->animations.targeting_limit[0] = 0.0f;
    bf->animations.targeting_limit[1] = 1.0f;
    bf->animations.targeting_limit[2] = 0.0f;
    bf->animations.targeting_limit[3] =-1.0f;
    vec3_set_one(bf->animations.targeting_axis_mod);
    bf->animations.targeting_bone = 0x00;
    bf->animations.targeting_flags = 0x0000;

    vec4_set_zero_angle(bf->animations.current_mod);
    bf->animations.next = NULL;
    bf->animations.onFrame = NULL;
    bf->animations.onEndFrame = NULL;
    bf->transform = NULL;
    bf->animations.model = model;
    bf->bone_tag_count = model->mesh_count;
    bf->bone_tags = (ss_bone_tag_p)malloc(bf->bone_tag_count * sizeof(ss_bone_tag_t));

    bf->bone_tags[0].parent = NULL;                                             // root
    for(uint16_t i = 0; i < bf->bone_tag_count; i++)
    {
        bf->bone_tags[i].index = i;
        bf->bone_tags[i].mesh_base = model->mesh_tree[i].mesh_base;
        bf->bone_tags[i].mesh_skin = model->mesh_tree[i].mesh_skin;
        bf->bone_tags[i].mesh_slot = NULL;
        bf->bone_tags[i].alt_anim = NULL;
        bf->bone_tags[i].body_part = model->mesh_tree[i].body_part;

        vec3_copy(bf->bone_tags[i].offset, model->mesh_tree[i].offset);
        vec4_set_zero(bf->bone_tags[i].qrotate);
        Mat4_E_macro(bf->bone_tags[i].transform);
        Mat4_E_macro(bf->bone_tags[i].full_transform);

        if(i > 0)
        {
            bf->bone_tags[i].parent = bf->bone_tags + model->mesh_tree[i].parent;
        }
    }
}
Example #17
0
/* find the two endpoints of a line segment that are inside a given sphere
   http://stackoverflow.com/a/17499940 */
int sphere_line_segment_intersection(const union vec3 *v0, const union vec3 *v1, const union vec3 *center, double r, union vec3 *vo0, union vec3 *vo1)
{
	double cx = center->v.x;
	double cy = center->v.y;
	double cz = center->v.z;

	double px = v0->v.x;
	double py = v0->v.y;
	double pz = v0->v.z;

	double vx = v1->v.x - px;
	double vy = v1->v.y - py;
	double vz = v1->v.z - pz;

	double A = vx * vx + vy * vy + vz * vz;
	double B = 2.0 * (px * vx + py * vy + pz * vz - vx * cx - vy * cy - vz * cz);
	double C = px * px - 2 * px * cx + cx * cx + py * py - 2 * py * cy + cy * cy +
		pz * pz - 2 * pz * cz + cz * cz - r * r;
	double D = B * B - 4.0 * A * C;

	/* outside or tanget to sphere, no segment intersection */
	if (D <= 0)
		return -1;

	double t1 = (-B - sqrt(D)) / (2.0 * A);
	double t2 = (-B + sqrt(D)) / (2.0 * A);

	/* infinte line intersects but this segment doesn't */
	if ((t1 < 0 && t2 < 0) || (t1 > 1 && t2 > 1))
		return -1;

	if (t1 < 0)
		vec3_copy(vo0, v0);
	else if (t1 > 1)
		vec3_copy(vo1, v1);
	else
		vec3_init(vo0, v0->v.x * (1.0 - t1) + t1 * v1->v.x, v0->v.y * (1.0 - t1) + t1 * v1->v.y, v0->v.z * (1.0 - t1) + t1 * v1->v.z);

	if (t2 < 0)
		vec3_copy(vo0, v0);
	else if (t2 > 1)
		vec3_copy(vo1, v1);
	else
		vec3_init(vo1, v0->v.x * (1.0 - t2) + t2 * v1->v.x, v0->v.y * (1.0 - t2) + t2 * v1->v.y, v0->v.z * (1.0 - t2) + t2 * v1->v.z);
	return 2;
}
Example #18
0
static void	raycast_light(t_hit *hit, unsigned depth)
{
	t_lstiter	it;
	t_ray		ray;
	t_light		*light;
	int			raycast_result;
	t_vec3		lightness;
	t_hit		sub_hit;

	if (depth == 0)
		return ;

	vec3_set(&lightness, 0, 0, 0);
	init_iter(&it, rt.scene->lights, increasing);
	while (lst_iterator_next(&it))
	{
		light = (t_light*)it.data;
		vec3_copy(&ray.origin, &hit->position);
		vec3_copy(&ray.direction, &light->position);
		vec3_sub(&ray.direction, &hit->position);
		vec3_normalize(&ray.direction);

		ray.origin.x += ray.direction.x * RC_SHADOW_SHIFT;
		ray.origin.y += ray.direction.y * RC_SHADOW_SHIFT;
		ray.origin.z += ray.direction.z * RC_SHADOW_SHIFT;

		raycast_result = raycast(&ray, &sub_hit, depth - 1, NULL);

		if (sub_hit.object != NULL)
		{
			// ray bounce
		}
		else
		{
			vec3_add(&lightness, &light->color);
		}
	}

	vec3_div(&lightness, rt.scene->lights->size);
	vec3_add(&lightness, &rt.scene->ambient_light);
	color_clamp(&lightness);

	hit->color.x *= lightness.x;
	hit->color.y *= lightness.y;
	hit->color.z *= lightness.z;
}
Example #19
0
void SkeletalModel_FillSkinnedMeshMap(skeletal_model_p model)
{
    uint32_t *ch;
    uint32_t founded_index = 0xFFFFFFFF;
    float tv[3];
    vertex_p v, founded_vertex;
    base_mesh_p mesh_base, mesh_skin;
    mesh_tree_tag_p tree_tag, prev_tree_tag;

    tree_tag = model->mesh_tree;
    for(uint16_t i = 0; i < model->mesh_count; i++, tree_tag++)
    {
        if(!tree_tag->mesh_skin)
        {
            continue;
        }
        mesh_base = tree_tag->mesh_base;
        mesh_skin = tree_tag->mesh_skin;
        ch = mesh_skin->skin_map = (uint32_t*)malloc(mesh_skin->vertex_count * sizeof(uint32_t));
        v = mesh_skin->vertices;
        for(uint32_t k = 0; k < mesh_skin->vertex_count; k++, v++, ch++)
        {
            *ch = 0xFFFFFFFF;
            founded_index = BaseMesh_FindVertexIndex(mesh_base, v->position);
            if(founded_index != 0xFFFFFFFF)
            {
                founded_vertex = mesh_base->vertices + founded_index;
                vec3_copy(v->position, founded_vertex->position);
                vec3_copy(v->normal, founded_vertex->normal);
            }
            else
            {
                vec3_add(tv, v->position, tree_tag->offset);
                prev_tree_tag = model->mesh_tree + tree_tag->parent;
                founded_index = BaseMesh_FindVertexIndex(prev_tree_tag->mesh_base, tv);
                if(founded_index != 0xFFFFFFFF)
                {
                    founded_vertex = prev_tree_tag->mesh_base->vertices + founded_index;
                    *ch = founded_index;
                    vec3_sub(v->position, founded_vertex->position, tree_tag->offset);
                    vec3_copy(v->normal, founded_vertex->normal);
                }
            }
        }
    }
}
Example #20
0
void BoneFrame_Copy(bone_frame_p dst, bone_frame_p src)
{
    if(dst->bone_tag_count < src->bone_tag_count)
    {
        dst->bone_tags = (bone_tag_p)realloc(dst->bone_tags, src->bone_tag_count * sizeof(bone_tag_t));
    }
    dst->bone_tag_count = src->bone_tag_count;
    vec3_copy(dst->pos, src->pos);
    vec3_copy(dst->centre, src->centre);
    vec3_copy(dst->bb_max, src->bb_max);
    vec3_copy(dst->bb_min, src->bb_min);

    for(uint16_t i = 0; i < dst->bone_tag_count; i++)
    {
        vec4_copy(dst->bone_tags[i].qrotate, src->bone_tags[i].qrotate);
        vec3_copy(dst->bone_tags[i].offset, src->bone_tags[i].offset);
    }
}
Example #21
0
void Polygon_TransformSelf(polygon_p p, float tr[16])
{
    float v[3];
    vertex_p vp;

    Mat4_vec3_rot_macro(v, tr, p->plane);
    vec3_copy(p->plane, v);
    vp = p->vertices;
    for(uint16_t i = 0; i < p->vertex_count; i++, vp++)
    {
        Mat4_vec3_mul_macro(v, tr, vp->position);
        vec3_copy(vp->position, v);
        Mat4_vec3_rot_macro(v, tr, vp->normal);
        vec3_copy(vp->normal, v);
    }

    p->plane[3] = -vec3_dot(p->plane, p->vertices[0].position);
}
Example #22
0
void SSBoneFrame_CreateFromModel(ss_bone_frame_p bf, skeletal_model_p model)
{
    vec3_set_zero(bf->bb_min);
    vec3_set_zero(bf->bb_max);
    vec3_set_zero(bf->centre);
    vec3_set_zero(bf->pos);
    bf->transform = NULL;
    bf->flags = 0x0000;
    bf->bone_tag_count = 0;
    bf->bone_tags = NULL;
    
    SSBoneFrame_InitSSAnim(&bf->animations, model, ANIM_TYPE_BASE);
    bf->animations.model = model;
    if(model)
    {
        bf->bone_tag_count = model->mesh_count;
        bf->bone_tags = (ss_bone_tag_p)malloc(bf->bone_tag_count * sizeof(ss_bone_tag_t));
        bf->bone_tags[0].parent = NULL;                                         // root
        for(uint16_t i = 0; i < bf->bone_tag_count; i++)
        {
            ss_bone_tag_p b_tag = bf->bone_tags + i;
            b_tag->index = i;
            b_tag->is_hidden = 0x00;
            b_tag->is_targeted = 0x00;
            b_tag->is_axis_modded = 0x00;
            b_tag->mesh_base = model->mesh_tree[i].mesh_base;
            b_tag->mesh_replace = NULL;
            b_tag->mesh_skin = NULL;
            b_tag->mesh_slot = NULL;
            b_tag->skin_map = NULL;
            b_tag->alt_anim = NULL;
            b_tag->body_part = model->mesh_tree[i].body_part;

            vec3_copy(b_tag->offset, model->mesh_tree[i].offset);
            vec4_set_zero(b_tag->qrotate);
            Mat4_E_macro(b_tag->local_transform);
            Mat4_E_macro(b_tag->current_transform);

            vec3_set_zero(b_tag->mod.target_pos);
            vec4_set_zero_angle(b_tag->mod.current_q);
            b_tag->mod.bone_local_direction[0] = 0.0f;
            b_tag->mod.bone_local_direction[1] = 1.0f;
            b_tag->mod.bone_local_direction[2] = 0.0f;
            b_tag->mod.limit[0] = 0.0f;
            b_tag->mod.limit[1] = 1.0f;
            b_tag->mod.limit[2] = 0.0f;
            b_tag->mod.limit[3] =-1.0f;
            b_tag->mod.current_slerp = 1.0f;
            vec3_set_one(b_tag->mod.axis_mod);
            
            if(i > 0)
            {
                b_tag->parent = bf->bone_tags + model->mesh_tree[i].parent;
            }
        }
    }
}
Example #23
0
void SSBoneFrame_TargetBoneToSlerp(struct ss_bone_frame_s *bf, struct ss_animation_s *ss_anim)
{
    extern float engine_frame_time;
    if(ss_anim->anim_ext_flags & ANIM_EXT_TARGET_TO)
    {
        ss_bone_tag_p b_tag = bf->bone_tags + ss_anim->targeting_bone;
        float clamped_q[4], q[4], target_dir[3], target_local[3], bone_dir[3];

        Mat4_vec3_mul_inv(target_local, bf->transform, ss_anim->target);
        if(b_tag->parent)
        {
            Mat4_vec3_mul_inv(target_local, b_tag->parent->full_transform, target_local);
        }
        vec3_sub(target_dir, target_local, b_tag->transform + 12);
        if(ss_anim->targeting_flags & ANIM_TARGET_OWERRIDE_ANIM)
        {
            Mat4_vec3_rot_macro(bone_dir, b_tag->transform, ss_anim->bone_direction);
        }
        else
        {
            vec3_copy(bone_dir, ss_anim->bone_direction);
        }

        vec4_GetQuaternionRotation(q, bone_dir, target_dir);
        if(ss_anim->targeting_flags & ANIM_TARGET_USE_AXIS_MOD)
        {
            q[0] *= ss_anim->targeting_axis_mod[0];
            q[1] *= ss_anim->targeting_axis_mod[1];
            q[2] *= ss_anim->targeting_axis_mod[2];
            q[3] = 1.0f - vec3_sqabs(q);
            q[3] = sqrtf(q[3]);
        }
        if(q[3] < ss_anim->targeting_limit[3])
        {
            vec4_clampw(q, ss_anim->targeting_limit[3]);
        }
        vec4_slerp_to(clamped_q, ss_anim->current_mod, q, engine_frame_time * M_PI / 1.3f);
        vec4_copy(ss_anim->current_mod, clamped_q);
        SSBoneFrame_RotateBone(bf, ss_anim->current_mod, ss_anim->targeting_bone);
    }
    else if(ss_anim->current_mod[3] < 1.0f)
    {       
        if(ss_anim->current_mod[3] < 0.99f)
        {
            float zero_ang[4] = {0.0f, 0.0f, 0.0f, 1.0f};
            float clamped_q[4];
            vec4_slerp_to(clamped_q, ss_anim->current_mod, zero_ang, engine_frame_time * M_PI / 1.3f);
            vec4_copy(ss_anim->current_mod, clamped_q);
            SSBoneFrame_RotateBone(bf, ss_anim->current_mod, ss_anim->targeting_bone);
        }
        else
        {
            vec4_set_zero_angle(ss_anim->current_mod);
        }
    }
}
Example #24
0
void SSBoneFrame_Update(struct ss_bone_frame_s *bf, float time)
{
    float t = 1.0f - bf->animations.lerp;
    ss_bone_tag_p btag = bf->bone_tags;
    bone_tag_p src_btag, next_btag;
    bone_frame_p prev_bf = &bf->animations.prev_bf;
    bone_frame_p curr_bf = &bf->animations.current_bf;
    
    vec3_interpolate_macro(bf->bb_max, prev_bf->bb_max, curr_bf->bb_max, bf->animations.lerp, t);
    vec3_interpolate_macro(bf->bb_min, prev_bf->bb_min, curr_bf->bb_min, bf->animations.lerp, t);
    vec3_interpolate_macro(bf->centre, prev_bf->centre, curr_bf->centre, bf->animations.lerp, t);
    vec3_interpolate_macro(bf->pos, prev_bf->pos, curr_bf->pos, bf->animations.lerp, t);
    
    next_btag = curr_bf->bone_tags;
    src_btag = prev_bf->bone_tags;
    for(uint16_t k = 0; k < prev_bf->bone_tag_count; k++, btag++, src_btag++, next_btag++)
    {
        vec3_interpolate_macro(btag->offset, src_btag->offset, next_btag->offset, bf->animations.lerp, t);
        vec3_copy(btag->local_transform + 12, btag->offset);
        btag->local_transform[15] = 1.0f;
        if(k == 0)
        {
            vec3_add(btag->local_transform + 12, btag->local_transform + 12, bf->pos);
            vec4_slerp(btag->qrotate, src_btag->qrotate, next_btag->qrotate, bf->animations.lerp);
        }
        else
        {
            bone_tag_p ov_src_btag = src_btag;
            bone_tag_p ov_next_btag = next_btag;
            float ov_lerp = bf->animations.lerp;
            if(btag->alt_anim && btag->alt_anim->model && btag->alt_anim->enabled && (btag->alt_anim->model->mesh_tree[k].replace_anim != 0))
            {
                bone_frame_p ov_curr_bf = &btag->alt_anim->prev_bf;
                bone_frame_p ov_next_bf = &btag->alt_anim->current_bf;
                ov_lerp = btag->alt_anim->lerp;
                ov_src_btag = ov_curr_bf->bone_tags + k;
                ov_next_btag = ov_next_bf->bone_tags + k;
            }
            vec4_slerp(btag->qrotate, ov_src_btag->qrotate, ov_next_btag->qrotate, ov_lerp);
        }
        Mat4_set_qrotation(btag->local_transform, btag->qrotate);
    }

    /*
     * build absolute coordinate matrix system
     */
    btag = bf->bone_tags;
    Mat4_Copy(btag->current_transform, btag->local_transform);
    btag++;
    for(uint16_t k = 1; k < prev_bf->bone_tag_count; k++, btag++)
    {
        Mat4_Mat4_mul(btag->current_transform, btag->parent->current_transform, btag->local_transform);
        SSBoneFrame_TargetBoneToSlerp(bf, btag, time);
    }
}
void leapfrog_start(sim_state_t* s, double dt)
{
    int n = s->n;
    for (int i = 0; i < n; ++i) {
        particle_t* p = s->part + i;
        vec3_copy(p->vh, p->v);
        vec3_saxpy(p->vh, dt/2, p->a);
        vec3_saxpy(p->v,  dt,   p->a);
        vec3_saxpy(p->x,  dt,   p->vh);
    }
    reflect_bc(s);
}
Example #26
0
t_vec3	vec3_normalize(t_cvec3 rhs)
{
	float	norme;
	t_vec3	ret;

	ret = vec3_copy(rhs);
	norme = vec3_norme(rhs);
	(*ret)[0] /= norme;
	(*ret)[1] /= norme;
	(*ret)[2] /= norme;
	return (ret);
}
Example #27
0
void polar_to_cart(struct vec3 *dst, const struct vec3 *v)
{
    struct vec3 cart;
    float  sinx = cosf(v->x);
    float  sinx_z = v->z * sinx;

    cart.x = sinx_z * sinf(v->y);
    cart.z = sinx_z * cosf(v->y);
    cart.y = v->z   * sinf(v->x);

    vec3_copy(dst, &cart);
}
Example #28
0
void Controls_PrimaryMouseDown(float from[3], float to[3])
{
    float test_to[3];
    collision_result_t cb;

    vec3_add_mul(test_to, engine_camera.gl_transform + 12, engine_camera.gl_transform + 8, 32768.0f);
    if(Physics_RayTestFiltered(&cb, engine_camera.gl_transform + 12, test_to, NULL))
    {
        vec3_copy(from, cb.point);
        vec3_add_mul(to, cb.point, cb.normale, 256.0);
    }
}
Example #29
0
void SSBoneFrame_SetTargetingAxisMod(struct ss_bone_tag_s *b_tag, const float mod[3])
{
    if(mod)
    {
        vec3_copy(b_tag->mod.axis_mod, mod);
        b_tag->is_axis_modded = 0x01;
    }
    else
    {
        vec3_set_one(b_tag->mod.axis_mod);
        b_tag->is_axis_modded = 0x00;
    }
}
Example #30
0
void SSBoneFrame_SetTargetingAxisMod(struct ss_animation_s *ss_anim, const float mod[3])
{
    if(mod)
    {
        vec3_copy(ss_anim->targeting_axis_mod, mod);
        ss_anim->targeting_flags |= ANIM_TARGET_USE_AXIS_MOD;
    }
    else
    {
        vec3_set_one(ss_anim->targeting_axis_mod);
        ss_anim->targeting_flags &= ~ANIM_TARGET_USE_AXIS_MOD;
    }
}