File: fly.c

package info (click to toggle)
s3d 0.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,708 kB
  • sloc: ansic: 23,609; python: 488; perl: 98; makefile: 31; sh: 29
file content (66 lines) | stat: -rw-r--r-- 1,927 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// SPDX-License-Identifier: GPL-2.0-or-later
/* SPDX-FileCopyrightText: 2004-2015  Simon Wunderlich <sw@simonwunderlich.de>
 */

#include "s3dfm.h"
#include <s3d.h> /* NULL */
#include <stdio.h> /* NULL */
#include <string.h> /* strncpy() */
#include <stdlib.h> /* malloc() */
#include <string.h> /* strncpy() */
static void _get_pos(t_node *work, t_node *f)
{
	if (f->parent != NULL) _get_pos(work, f->parent);
	work->px += f->px          * work->scale;
	work->pz += f->pz          * work->scale;
	work->py += f->py          * work->scale;
	/*
	printf("%s: %3.3f %3.3f %3.3f - %3.3f\n",f->name, f->px, f->py, f->pz, f->scale );
	printf("### %3.3f %3.3f %3.3f - %3.3f)\n", work->px, work->py, work->pz, work->scale);
	*/
	if (f->parent == NULL) work->scale = f->scale;
	else     work->scale = work->scale * f->scale;

}

int fly_set_absolute_position(t_node *node)
{
	t_node work;
	work.px = 0;
	work.py = 0;
	work.pz = 0;
	work.scale = 1.0;
	_get_pos(&work, node);
	node->px = work.px;
	node->py = work.py;
	node->pz = work.pz;
	node->scale = work.scale;
	/* printf("node coordinates: %3.3f %3.3f %3.3f %3.3f\n",node->px,node->py,node->pz,node->scale);*/
	return 0;
}
/* create a copy of *node as an icon (block) which can be moved for animation ... */
t_node *fly_create_anode(t_node *node)
{
	t_node *work;
	work = (t_node*)malloc(sizeof(t_node));
	node_init(work);
	work->parent = node->parent;
	work->scale = node->scale;
	work->px = node->px;
	work->py = node->py;
	work->pz = node->pz;
	work->type = node->type;
	mstrncpy(work->name, node->name, M_NAME);
	fly_set_absolute_position(work);
	icon_draw(work);

	work->dpx = work->px;
	work->dpy = work->py;
	work->dpz = work->pz;
	work->dscale = work->scale;
	work->py = 2 * work->scale - work->py; /* invert */
	s3d_flags_on(work->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE);
	s3d_flags_on(work->objs.str, S3D_OF_VISIBLE | S3D_OF_SELECTABLE);
	ani_add(work);
	return work;
}