c++


Converting std::vector of Vertices stucts to float*


What would be the best way of converting std::vector of Vertices to float*? I have vtx as my original data, which contains two vertices with position, normal and uv and I have std::vector of vertices v with the same position, normal and uv. What I am trying to achieve is getting the same memory layout and data as vtx into vtx2 using std::vector v. I tried copying the memory from v to vtx2 using memcpy but when I print them they are ordered in different way.
#include <iostream>
#include <vector>
using namespace std;
struct Vector3
{
float x;
float y;
float z;
};
struct Vector2
{
float x;
float y;
};
struct Vertex
{
Vector3 position;
Vector3 normal;
Vector2 uv;
};
int main(int argc, char *argv[])
{
const int n = 16;
float* vtx = new float[n];
// Vertex 1
// Position
vtx[0] = 1.0f;
vtx[1] = 2.0f;
vtx[2] = 3.0f;
// Normal
vtx[3] = 0.1f;
vtx[4] = 0.2f;
vtx[5] = 0.3f;
// UV
vtx[6] = 0.0f;
vtx[7] = 1.0f;
vtx += 8;
// Vertex 2
// Position
vtx[0] = 4.0f;
vtx[1] = 5.0f;
vtx[2] = 6.0f;
// Normal
vtx[3] = 0.2f;
vtx[4] = 0.3f;
vtx[5] = 0.4f;
// UV
vtx[6] = 0.0f;
vtx[7] = 1.0f;
vtx += 8;
for (int i = n; i>0; i--)
{
cout << *(vtx + i * -1) << endl;
}
vector<Vertex> v;
Vertex vt;
// Vertex 1
// Position
Vector3 pos1 = {1.0, 2.0, 3.0};
vt.position = pos1;
// Normal
Vector3 normal1 = {0.1, 0.2, 0.3};
vt.position = normal1;
// UV
Vector2 uv1 = {0.0, 1.0};
vt.uv = uv1;
v.push_back(vt);
// Vertex 2
// Position
Vector3 pos2 = {4.0, 5.0, 6.0};
vt.position = pos2;
// Normal
Vector3 normal2 = {0.2, 0.3, 0.4};
vt.position = normal2;
// UV
Vector2 uv2 = {0.0, 1.0};
vt.uv = uv2;
v.push_back(vt);
float* vtx2 = new float[n];
memcpy(vtx2, &v[0], v.size() * sizeof(Vertex));
for (int i = n; i>0; i--)
{
cout << *(vtx2 + i * -1) << endl;
}
delete[] vtx;
delete[] vtx2;
return 0;
}
There is a bug in your code:
vt.position = normal1
should read
vt.normal = normal1
And similarly for the second vertex in your vector. Upon fixing that you may find the output matches (it does for me), but it may depend on how your compiler is padding structs.
For example, forcing a different alignment on Vector3 using struct Vector3 {...} __attribute__ ((aligned (16))); will generate "corrupted" output.
#include <cstring>
#include <iostream>
#include <vector>
#include <cstddef>
using namespace std;
struct Vector3
{
float x;
float y;
float z;
};
struct Vector2
{
float x;
float y;
};
struct Vertex
{
Vector3 position;
Vector3 normal;
Vector2 uv;
};
int main(int argc, char *argv[])
{
const int n = 16;
float* vtx1 = new float[n];
float* vtx = vtx1;
cout << offsetof(Vertex, normal) << " " << offsetof(Vertex, uv) << " " << sizeof(Vertex) << "\n";
// Vertex 1
// Position
vtx[0] = 1.0f;
vtx[1] = 2.0f;
vtx[2] = 3.0f;
// Normal
vtx[3] = 0.1f;
vtx[4] = 0.2f;
vtx[5] = 0.3f;
// UV
vtx[6] = 0.0f;
vtx[7] = 1.0f;
vtx += 8;
// Vertex 2
// Position
vtx[0] = 4.0f;
vtx[1] = 5.0f;
vtx[2] = 6.0f;
// Normal
vtx[3] = 0.2f;
vtx[4] = 0.3f;
vtx[5] = 0.4f;
// UV
vtx[6] = 0.0f;
vtx[7] = 1.0f;
vtx += 8;
for (int i = n; i>0; i--)
{
cout << *(vtx + i * -1) << endl;
}
cout << "\n";
vector<Vertex> v;
Vertex vt;
// Vertex 1
// Position
Vector3 pos1 = {1.0, 2.0, 3.0};
vt.position = pos1;
// Normal
Vector3 normal1 = {0.1, 0.2, 0.3};
vt.normal = normal1;
// UV
Vector2 uv1 = {0.0, 1.0};
vt.uv = uv1;
v.push_back(vt);
// Vertex 2
// Position
Vector3 pos2 = {4.0, 5.0, 6.0};
vt.position = pos2;
// Normal
Vector3 normal2 = {0.2, 0.3, 0.4};
vt.normal = normal2;
// UV
Vector2 uv2 = {0.0, 1.0};
vt.uv = uv2;
v.push_back(vt);
float* vtx2 = new float[n];
vtx = vtx2;
memcpy(vtx, &v[0], n*sizeof(float));
vtx += n;
for (int i = n; i>0; i--)
{
cout << *(vtx + i * -1) << endl;
}
delete[] vtx1;
delete[] vtx2;
return 0;
}
Here is some corrected code with .normal instead of .position, it doesn't delete random memory by deleting vtx and the second print loop is fixed to show the data in the array instead of the 16 bytes of memory preceding it. It also prints the struct size and offsets in the first line. If you don't get 12 24 32 as the first line, your compiler is padding the structs with empty space which is causing your problems. You can use struct Vertex __attribute__((packed)) to prevent this on GCC or clang. Other compilers have different ways of doing it.

Related Links

Signal and slot syntax for qt combo box [duplicate]
Is it possible to run a 'C' binary which inside calls matlab functions?
invalid conversion from 'char' to 'char*' strcat function
How do I boost::range::sort() a boost::transformed_range?
Timestamp difference with two decimals c++
OpenGL: draw triangles from GPU memory [duplicate]
HTML Code Coverage Report with Visual C++ and Catch
Remove all occurrences of the given string from doubly linked list
Assertion `IsArray()' failed (RapidJSON)
Can't link GTKmm 3 app with minGW64 ithin MSYS2: ustring constructor not found
C++ and C++11 class static member, double should use “constexpr” while int can be “const”, why?
Smallest 'install footprint' for Visual Studio 2017 - C++ core language & standard library
The behaviour of floating point division by zero
Share resource between multiple pthread, POCO thread and boost thread
Should *all* function templates be passed as rvalue?
Clang++ vs g++ difference in overloaded function declaration order [duplicate]

Categories

HOME
.htaccess
coldfusion
rstudio
scadalts
monitoring
aws-codepipeline
servicestack
etcd
reactor-netty
wlan
uiviewcontroller
sublimelinter
linuxmint
pymc
ios8
chapel
google-vr
vbulletin
boost-intrusive
docbook
mit-scratch
adodb-php
prestashop-1.6
web-component
apprtcdemo
osx-elcapitan
touch
scons
eof
avaya
autoload
chinese-locale
spacing
omnipay
jquery-chosen
c#-to-f#
tablet
azure-virtual-machine
gunicorn
bootstrapping
outlook-web-app
960.gs
marytts
uievent
mlt
fluent-nhibernate
paypal-adaptive-payments
exports-loader
javassist
c++1z
release-management
implicit
erlang-shell
canonical-link
vibration
launch-agent
syncsort-dmx-h
pubsubhubbub
tizen-sdb
idfa
yahoo-messenger
execution-time
johnny-five
javascript-globalize
yard
singularitygs
tess-two
excel-2008
mpi4py
slab
sql-job
pegjs
django-1.7
jekyll-extensions
option
kiwi
intel-galileo
mashup
mat-file
system-design
dynamic-content
flotr
pasteboard
eda
equivalent
openflashchart2
multiple-versions
language-theory
abbreviation
reverse-debugging

Resources

Encrypt Message



code
soft
python
ios
c
html
jquery
cloud
mobile