mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 09:52:27 -04:00
fix PfmFile::extrude()
This commit is contained in:
parent
3df5abf110
commit
f0c6f3fb45
@ -984,20 +984,29 @@ project(const Lens *lens) {
|
|||||||
// an (x, y, z) point, by reversing project(). If the
|
// an (x, y, z) point, by reversing project(). If the
|
||||||
// original file is only a 1-d file, assumes that it is
|
// original file is only a 1-d file, assumes that it is
|
||||||
// a depth map with implicit (u, v) coordinates.
|
// a depth map with implicit (u, v) coordinates.
|
||||||
|
//
|
||||||
|
// This method is only valid for a linear lens (e.g. a
|
||||||
|
// PerspectiveLens or OrthographicLens). Non-linear
|
||||||
|
// lenses don't necessarily compute a sensible depth
|
||||||
|
// coordinate.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void PfmFile::
|
void PfmFile::
|
||||||
extrude(const Lens *lens) {
|
extrude(const Lens *lens) {
|
||||||
nassertv(is_valid());
|
nassertv(is_valid());
|
||||||
|
nassertv(lens->is_linear());
|
||||||
|
|
||||||
static LMatrix4 from_uv(2.0, 0.0, 0.0, 0.0,
|
static LMatrix4 from_uv(2.0, 0.0, 0.0, 0.0,
|
||||||
0.0, 2.0, 0.0, 0.0,
|
0.0, 2.0, 0.0, 0.0,
|
||||||
0.0, 0.0, 2.0, 0.0,
|
0.0, 0.0, 2.0, 0.0,
|
||||||
-1.0, -1.0, -1.0, 1.0);
|
-1.0, -1.0, -1.0, 1.0);
|
||||||
|
const LMatrix4 &proj_mat_inv = lens->get_projection_mat_inv();
|
||||||
|
|
||||||
PfmFile result;
|
PfmFile result;
|
||||||
result.clear(_x_size, _y_size, 3);
|
result.clear(_x_size, _y_size, 3);
|
||||||
result.set_zero_special(true);
|
result.set_zero_special(true);
|
||||||
|
|
||||||
|
if (_num_channels == 1) {
|
||||||
|
// Create an implicit UV coordinate for each point.
|
||||||
LPoint2 uv_scale(1.0, 1.0);
|
LPoint2 uv_scale(1.0, 1.0);
|
||||||
if (_x_size > 1) {
|
if (_x_size > 1) {
|
||||||
uv_scale[0] = 1.0 / PN_stdfloat(_x_size - 1);
|
uv_scale[0] = 1.0 / PN_stdfloat(_x_size - 1);
|
||||||
@ -1005,34 +1014,34 @@ extrude(const Lens *lens) {
|
|||||||
if (_y_size > 1) {
|
if (_y_size > 1) {
|
||||||
uv_scale[1] = 1.0 / PN_stdfloat(_y_size - 1);
|
uv_scale[1] = 1.0 / PN_stdfloat(_y_size - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int yi = 0; yi < _y_size; ++yi) {
|
for (int yi = 0; yi < _y_size; ++yi) {
|
||||||
for (int xi = 0; xi < _x_size; ++xi) {
|
for (int xi = 0; xi < _x_size; ++xi) {
|
||||||
if (!has_point(xi, yi)) {
|
if (!has_point(xi, yi)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
LPoint3 p;
|
LPoint3 p;
|
||||||
if (_num_channels == 1) {
|
|
||||||
p.set((PN_stdfloat)xi * uv_scale[0],
|
p.set((PN_stdfloat)xi * uv_scale[0],
|
||||||
(PN_stdfloat)yi * uv_scale[1],
|
(PN_stdfloat)yi * uv_scale[1],
|
||||||
(PN_stdfloat)get_point1(xi, yi));
|
(PN_stdfloat)get_point1(xi, yi));
|
||||||
} else {
|
|
||||||
p = LCAST(PN_stdfloat, get_point(xi, yi));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lens->is_linear()) {
|
|
||||||
lens->get_projection_mat_inv().xform_point_general_in_place(p);
|
|
||||||
result.set_point(xi, yi, p);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
from_uv.xform_point_in_place(p);
|
from_uv.xform_point_in_place(p);
|
||||||
LPoint3 near_point, far_point;
|
proj_mat_inv.xform_point_general_in_place(p);
|
||||||
if (!lens->extrude(p, near_point, far_point)) {
|
result.set_point(xi, yi, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Use the existing UV coordinate for each point.
|
||||||
|
for (int yi = 0; yi < _y_size; ++yi) {
|
||||||
|
for (int xi = 0; xi < _x_size; ++xi) {
|
||||||
|
if (!has_point(xi, yi)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
LPoint3 p;
|
||||||
|
p = LCAST(PN_stdfloat, get_point(xi, yi));
|
||||||
|
|
||||||
LPoint3 film = near_point + (far_point - near_point) * p[2];
|
from_uv.xform_point_in_place(p);
|
||||||
result.set_point(xi, yi, film);
|
proj_mat_inv.xform_point_general_in_place(p);
|
||||||
|
result.set_point(xi, yi, p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user