[Interest] Drawing a dashed line with Qt Quick 3D
Laszlo Agocs
laszlo.agocs at qt.io
Fri May 28 20:59:16 CEST 2021
Hi,
The custom geometry lacks UV coordinates in your example application, and so it samples with texture coordinates (0, 0) for any fragment, hence getting a line with color0 instead of the expected color0-color1-color0-...
Add two floats per vertex and register an attribute for TexCoord0:
m_vertexData.resize(m_count * 5 * sizeof(float));
...
*p++ = 0.0f; // U
*p++ = 0.0f; // V
...
*p++ = 1.0f; // U
*p++ = 0.0f; // V
...
setStride(5 * sizeof(float));
addAttribute(QQuick3DGeometry::Attribute::PositionSemantic, 0, Attribute::F32Type);
addAttribute(QQuick3DGeometry::Attribute::TexCoord0Semantic, 3 * sizeof(float), Attribute::F32Type);
Best regards,
Laszlo
________________________________
From: Interest <interest-bounces at qt-project.org> on behalf of joao morgado via Interest <interest at qt-project.org>
Sent: Friday, May 28, 2021 6:07 PM
To: interest at qt-project.org <interest at qt-project.org>
Subject: [Interest] Drawing a dashed line with Qt Quick 3D
I'm trying to make a dashed line in quick3d.
I made the line with QQuick3DGeometry, and exposed it to qml, all good.
Then I tried to apply a custom texture with QQuick3DTextureData, using a texture made with 2 colors with size of 2x1 pixels, but I only get to see the first color.
I sucessfully did in the past a dashed line example with raw OpenGL see here:
Bitbucket<https://bitbucket.org/joaodeusmorgado/opengltutorials/src/master/T07.1_TextureLines/mygl.cpp>
<https://bitbucket.org/joaodeusmorgado/opengltutorials/src/master/T07.1_TextureLines/mygl.cpp>
Bitbucket
Here is the small qt quick 3d example that is failling:
LineDashed.zip<https://drive.google.com/file/d/1ND5xsCLCdM2zK35Yt8PbOaC3ycTleKwc/view?usp=sharing>
<https://drive.google.com/file/d/1ND5xsCLCdM2zK35Yt8PbOaC3ycTleKwc/view?usp=sharing>
[https://s.yimg.com/lb/brands/80x80_google.png]
LineDashed.zip
Any help is welcome.
The relevant code is:
// main.qml
View3D {
id: view3D
visible: true
anchors.fill: parent
......
importScene: sceneRoot
Node {
id: sceneRoot
......
// solid line, all good
Line {
p0: Qt.vector3d(-55, 55, 0)
p1: Qt.vector3d(55, -55, 0)
baseColor: "red"
//visible: false
}
// dashed line, error: only the first color is show
Line_dashed {
p0: Qt.vector3d(-80, -40, 0)
p1: Qt.vector3d(80, 80, 0)
color1: "orange"
color2: "yellow"
//visible: false
}
}//Node: sceneRoot
}//View3D
}
// Line_dashed.qml
import QtQuick 2.12
import QtQuick3D 1.15
import Entity_Line 1.0
import LineTexture 1.0
Node {
property alias p0: line.p0
property alias p1: line.p1
property alias color1: lineTex.color1
property alias color2: lineTex.color2
Model {
geometry: EntityLine {
id: line
p0: Qt.vector3d(-55, -55, 50)
p1: Qt.vector3d(55, 55, 50)
}
materials: DefaultMaterial {
id: material
lighting: DefaultMaterial.NoLighting
diffuseMap: Texture {
textureData: LineTexture {
id: lineTex
//color1: "blue"
//color2: "white"
}
magFilter: Texture.Nearest
minFilter: Texture.Nearest
mappingMode: Texture.UV
scaleU: 2
scaleV: 1
}
}
pickable: true
property bool isPicked: false
}
}
// custom texture
void LineTexture::generateTextureData()
{
m_textureData.resize(2 * 4 * sizeof (float)); //QByteArray
float *p = reinterpret_cast<float *>(m_textureData.data());
*p++ = m_color1.redF();
*p++ = m_color1.greenF();
*p++ = m_color1.blueF();
*p++ = m_color1.alphaF();
*p++ = m_color2.redF();
*p++ = m_color2.greenF();
*p++ = m_color2.blueF();
*p++ = m_color2.alphaF();
setTextureData(m_textureData);
setSize(QSize(2,1));
//setFormat(QQuick3DTextureData::Format::RGBA8);
setFormat(QQuick3DTextureData::Format::RGBA32F);
setHasTransparency(true);
}
Cheers
João
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20210528/4f9acc53/attachment.html>
More information about the Interest
mailing list