source: proiecte/SIMEO/Simeo/src/SimeoGui/GuiUpdater.cpp @ 167

Last change on this file since 167 was 167, checked in by (none), 14 years ago

Simeo: added final project and also older proof of concept code.

We used Git for version control, so look at the Git repo
in SIMEO/Simeo/ for more info.

File size: 5.9 KB
Line 
1#include "GuiUpdater.h"
2
3
4GuiUpdater::GuiUpdater(int port, hostent *serv)
5{
6        portno = port;
7        server = serv;
8}
9
10
11GuiUpdater::~GuiUpdater()
12{
13
14}
15
16
17void GuiUpdater::init()
18{
19        char buffer[256];
20        int n;
21
22    sockfd = socket(AF_INET, SOCK_STREAM, 0);
23
24    if (sockfd < 0) {
25        printf("Error opening socket\n");
26                exit(0);
27        }
28
29    if (server == NULL) {
30        printf("Error, no such host\n");
31        exit(0);
32    }
33
34    memset((char *) &serv_addr, 0, sizeof(serv_addr));
35    serv_addr.sin_family = AF_INET;
36    memcpy((char *)&serv_addr.sin_addr.s_addr,
37           (char *)server->h_addr,
38           server->h_length);
39    serv_addr.sin_port = htons(portno);
40
41    if (connect(sockfd,(struct sockaddr*) &serv_addr,sizeof(serv_addr)) < 0) {
42        printf("Error connecting!\n");
43                exit(0);
44        }
45
46    // astept mesaj de la server
47    memset(buffer, 0, 256);
48    n = recv(sockfd, buffer, 255, 0);
49
50    if (n < 0) {
51            printf("Error reading from socket!\n");
52                exit(0);
53        }
54
55    printf("[SRV]%s\n", buffer);
56
57}
58
59void GuiUpdater::receiveData(int sock, void* buffer, size_t size)
60{
61        size_t total;
62        int ret;
63
64        for (total = 0; total < size; total += ret) {
65                ret = recv(sock, (char *) buffer + total, size - total, 0);
66                if (ret <= 0) {
67                        perror("recv");
68                        exit(-1);
69                }
70        }
71}
72
73void* GuiUpdater::unpackInt(void *buffer, int &a)
74{
75        int *buff = (int *) buffer;
76        a = *buff ++;
77
78        return buff;
79}
80
81void* GuiUpdater::unpackScalar(void *buffer, btScalar &a)
82{
83        float *buff = (float *) buffer;
84        a = *buff ++;
85
86        return buff;
87}
88
89void* GuiUpdater::unpackVector3(void *buffer, btVector3 &v)
90{
91        btScalar a;
92
93        buffer = unpackScalar(buffer, a);
94        v.setX(a);
95        buffer = unpackScalar(buffer, a);
96        v.setY(a);
97        buffer = unpackScalar(buffer, a);
98        v.setZ(a);
99
100        return buffer;
101}
102
103void* GuiUpdater::unpackMatrix3x3(void *buffer, btMatrix3x3 &m)
104{
105        btVector3 v;
106
107        for (int i = 0; i < 3; ++ i) {
108                buffer = unpackVector3(buffer, m[i]);
109        }
110
111        return buffer;
112}
113
114void GuiUpdater::unpackAddData(void *buffer, int n, map<int,guiAddData *> &addObjects)
115{
116        for (int i = 0; i < n; ++ i) {
117                guiAddData *obj = new guiAddData;
118                int j;
119
120                buffer = unpackInt(buffer, obj->id);
121                buffer = unpackInt(buffer, obj->numIndices);
122
123                obj->indexPointer = new int [obj->numIndices];
124                for (j = 0; j < obj->numIndices; ++ j) {
125                        buffer = unpackInt(buffer, obj->indexPointer[j]);
126                }
127
128                buffer = unpackInt(buffer, obj->numVertices);
129                obj->vertexPointer = new btVector3 [obj->numVertices];
130                for (j = 0; j < obj->numVertices; ++ j) {
131                                buffer = unpackVector3(buffer, obj->vertexPointer[j]);
132                }
133
134                addObjects[obj->id] = obj;
135        }
136}
137
138void GuiUpdater::unpackUpdateData(void *buffer, int n, map<int, guiUpdateData *> &updateObjects)
139{
140        for (int i = 0; i < n; ++ i) {
141                guiUpdateData *obj = new guiUpdateData;
142                int j;
143
144                buffer = unpackInt(buffer, obj->id);
145
146                for (j = 0; j < 16; ++ j) {
147                        buffer = unpackScalar(buffer, obj->m[j]);
148                }
149
150                buffer = unpackMatrix3x3(buffer, obj->rot);
151
152                buffer = unpackVector3(buffer, obj->aabbMin);
153
154                buffer = unpackVector3(buffer, obj->aabbMax);
155
156                updateObjects[obj->id] = obj;
157        }
158}
159
160void GuiUpdater::applyChanges(map<int, guiAddData *> addObjects, map<int, guiUpdateData *> updateObjects, int *removeObjects, int remObjNum)
161{
162//      getchar();
163        map<int, guiAddData *>::iterator it_add = addObjects.begin();
164        for ( ; it_add != addObjects.end(); it_add ++) {
165//              printf("[%d]\n", addObjects.coun);
166                if (m_cache.find(it_add->first) != m_cache.end()) {
167                        printf("Adding existing object\n");
168                        exit(-1);
169                }
170
171                guiObject *obj = new guiObject;
172                obj->ad = it_add->second;
173                if (m_cache[it_add->second->id]) delete m_cache[it_add->second->id];
174                m_cache[it_add->second->id] = obj;
175        }
176
177        map<int, guiUpdateData *>::iterator it_update = updateObjects.begin();
178        for ( ; it_update != updateObjects.end(); it_update ++) {
179                if (m_cache.find(it_update->first) != m_cache.end()) {
180                        guiObject *obj = m_cache.find(it_update->first)->second;
181                        obj->ud = it_update->second;
182                } else {
183                        printf("Updating missing object\n");
184//                      exit(-1);
185                }
186        }
187
188        map<int, guiObject *>::iterator it;
189        for (int i = 0; i < remObjNum; ++ i) {
190                it = m_cache.find(removeObjects[i]);
191                if (it != m_cache.end()) {
192                        delete it->second;
193                        m_cache.erase(it);
194                }
195        }
196}
197
198int GuiUpdater::update()
199{
200        map<int, guiAddData *> addObjects;
201        map<int, guiUpdateData *> updateObjects;
202        int *removeObjects;
203
204//      char buffer[256];
205        char ask = 'a';
206        int n;
207
208        n = send(sockfd,(const void*) &ask,1, 0);
209        if (n < 0) {
210                        printf("Error writing to socket!\n");
211                exit(0);
212        }
213
214
215        int size;
216
217        // receive add objects
218        receiveData(sockfd, (void *) &n, sizeof(int));
219        receiveData(sockfd, (void *) &size, sizeof(int));
220
221
222        void *buffer = new char [size];
223        receiveData(sockfd, (void *) buffer, size);
224        unpackAddData(buffer, n, addObjects);
225        delete [] (char *) buffer;
226        printf("added object no = %d (%d)\n", (int) addObjects.size(), n);
227
228        // receive update objects
229        receiveData(sockfd, (void *) &n, sizeof(int));
230        receiveData(sockfd, (void *) &size, sizeof(int));
231        buffer = new char [size];
232        receiveData(sockfd, (void *) buffer, size);
233        unpackUpdateData(buffer, n, updateObjects);
234        delete [] (char *) buffer;
235
236        printf("updated object no = %d (%d)\n", (int) updateObjects.size(), n);
237        map<int, guiUpdateData *>::iterator it = updateObjects.begin();
238        for ( ; it != updateObjects.end(); it ++) {
239                for (int j = 0; j < 16; ++ j) {
240                //      buffer = unpackScalar(buffer, obj->m[j]);
241                        printf("TEST %d, %d: %f\n", j, it->first, it->second->m[j]);
242                }
243        }
244
245        // receive remove objects
246        receiveData(sockfd, (void *) &n, sizeof(int));
247        removeObjects = new int[n];     // the number of objects (object ids in this case)
248        receiveData(sockfd, (void *) &size, sizeof(int));
249        buffer = new char [size];
250        receiveData(sockfd, (void *) buffer, size);
251
252        for (int i = 0; i < n; ++ i) {
253                buffer = unpackInt(buffer, removeObjects[i]);
254        }
255
256        delete [] (int *) buffer;
257
258        applyChanges(addObjects, updateObjects, removeObjects, n);
259
260//      gd = new guiUpdateData[n];
261//      receiveData(sockfd, (void *) gd, sizeof(guiUpdateData) * n);
262
263        return n;
264}
265
266
267
268
269
Note: See TracBrowser for help on using the repository browser.