小编Mak*_*gan的帖子

Rust 为任何类型定义特征接口?

我正在构建一个渲染引擎,我想要的一件事是处理任意网格数据的管理,无论表示如何。

我的想法是,定义一个特征来强制执行函数签名,然后当我处理所有 GPU 内容时,用户可以处理序列化。这就是我所创造的特质:

pub enum GpuAttributeData
{
    OwnedData(Vec<Vec<i8>>, Vec<u32>),
}
pub trait GpuSerializable
{
    fn serialize(&self) -> GpuAttributeData;
}
Run Code Online (Sandbox Code Playgroud)

非常简单,给我几个数组。

当我测试板条箱内的东西时,它起作用了,但我将示例移到了板条箱外,即我在示例中包含以下代码片段:


impl <const N : usize> GpuSerializable for [Vertex; N]
{
    fn serialize(&self) -> GpuAttributeData
    {
        let size = size_of::<Vertex>() * self.len();
        let data = unsafe {
            let mut data = Vec::<i8>::with_capacity(size);
            copy_nonoverlapping(
                self.as_ptr() as *const i8, data.as_ptr() as *mut i8, size);
            data.set_len(size);
            data
        };

        // let indices : Vec<usize> = (0..self.len()).into_iter().collect();
        let indices = vec![0, 1, 2];
        let …
Run Code Online (Sandbox Code Playgroud)

serialization gpu traits rust

1
推荐指数
1
解决办法
393
查看次数

带数据的通用回调

关于这个主题已经有一个非常受欢迎的问题,但我不完全理解答案。

目标是:

我需要一个“函数指针”列表(读取 Vec)来修改存储在程序中其他位置的数据。我能想到的最简单的例子是按下按键时调用的回调。因此,当按下任意键时,传递给该对象的所有函数都将按某种顺序调用。

阅读答案后,我不清楚如何才能列出这样的列表。听起来我需要将回调的类型限制为已知的类型,否则我不知道如何创建它的数组。

我也不清楚如何存储数据指针/引用。

说我有

struct Processor<CB>
where
    CB: FnMut(),
{
    callback: CB,
}
Run Code Online (Sandbox Code Playgroud)

就像答案所暗示的那样,我无法制作处理器阵列,可以吗?因为每个处理器在技术上都是不同的类型,具体取决于通用实例。

events callback rust

1
推荐指数
1
解决办法
68
查看次数

状态机生锈了?

在 C 系列语言中,我通常将状态机实现为一系列 if else 语句和枚举,其中 if 语句检查机器处于哪个状态,并且主体执行状态转换,例如:

if(current_left_state == GLFW_PRESS && !left_pressed)
{
    left_pressed = true;
    return MouseInputState::LEFT_DOWN;
}
if(current_left_state == GLFW_PRESS && left_pressed)
{
    left_pressed = true;
    return MouseInputState::LEFT_DRAG;
}
if(current_left_state == GLFW_RELEASE && left_pressed)
{
    left_pressed = false;
    return MouseInputState::LEFT_UP;
}
if(current_right_state == GLFW_PRESS && !right_pressed)
{
    right_pressed = true;
    return MouseInputState::RIGHT_DOWN;
}
Run Code Online (Sandbox Code Playgroud)

Rust 有很多惯用的糖,这很好,我想知道是否有一种方法可以使用 Rust 的语法糖来制作更干净的状态机。

就像,一定有比这更好的方法:

MouseState::NoAction =>
{
    if *button == glfw::MouseButtonLeft && *action == glfw::Action::Press
    {
        return MouseState::LeftDown;
    }
    if *button == glfw::MouseButtonRight …
Run Code Online (Sandbox Code Playgroud)

syntax state-machine rust

1
推荐指数
1
解决办法
1059
查看次数

设计样条函子的更合理方法?

我对样条数据结构做了以下定义:

#[derive(Clone, Debug)]
pub struct BSpline
{
    knots: Vec<f32>,
    control_points: Vec<Vec3>,
    /// Internal helper variable. Used to optimize repetetitive samplings on close
    /// $t$ values.
    last_t_index: usize,
    order: usize,
}

impl BSpline
{
    pub fn sample(&self, t: f32) -> Vec3
    {
        debug_assert!(self.control_points.len() >= self.order);

        let t = f32::clamp(t, self.knots[0], *self.knots.last().unwrap());

        let mut t_index = self.last_t_index;
        while !(t >= self.knots[t_index] && t <= self.knots[t_index + 1])
        {
            t_index = (t_index + 1) % self.knots.len();
        }

        // TODO(low): find a better way …
Run Code Online (Sandbox Code Playgroud)

pointers unsafe type-safety rust

1
推荐指数
1
解决办法
60
查看次数

C 中使用指针进行类型转换

以下类型转换是否会在内存中创建一个新变量?下面的 printf 函数引用了它,并打印 1.23 作为答案。

#include<stdio.h>
int main(){
    int num;
    num = 1.23456;
    printf("num = %.2f \n", (float)num);
    *((float*) &num) = 1.23456;
    printf("num = %.2f \n", *((float*)&num));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c pointers

0
推荐指数
1
解决办法
1086
查看次数

有没有办法在OpenGL着色器中丢弃几何,顶点或片段?

我正在使用实例渲染来绘制大量的立方体.现在,显然立方体中可见面的最大数量是3,这意味着就着色而言,我所做的工作量是所需的两倍.

因为这是实例化,所以我不能简单地只传递要绘制到着色器的几何体.但是如果在着色器中(我想象这将是几何形状或细分)我可以使用普通信息来丢弃基元,我可以减少不必要的操作数量.

例如,如果观察方向和表面法线之间的角度小于90度,我可以假设在当前方向前面有一个三角形,因此丢弃了这个给定的图元.

在管道中是否有一种方法可以确定是否需要片段并相应地丢弃它?

opengl shader glsl geometry-shader

0
推荐指数
1
解决办法
1468
查看次数

VS code API 文档不清楚如何读取 json 可定制值

我已经阅读了在线文档和 VS code API 的源代码,但我仍然不清楚如何读取 JSON 用户设置和工作空间设置。我尝试寻找示例,但找不到仅显示如何执行此操作的内容。

本质上我想要一个名为“最大值”的设置值。然后我想从 TS scrypt 读取最大值。

该文档引导我在 activate 函数中编写以下两行:

const config = vscode.workspace.getConfiguration('extension', vscode.window.activeTextEditor.document.uri);
vscode.window.showInformationMessage(config.has('configuration').toString());
Run Code Online (Sandbox Code Playgroud)

在我添加的 package.json 文件中,在贡献下:

    "configuration": {
        "maximum":
        {
            "type": ["integer"],
            "default": 40,
            "description": "The level of alignment, how far the titles will extend horizontally"
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是我的输出是 false 。

我尝试了多个不同的输出,唯一一次我得到正确的结果是当第一个函数的参数是“启动”而第二个参数是“配置”时。

我无法仅从文档中了解参数需要是什么。也不应该在哪里指定该值。

api json typescript visual-studio-code vscode-extensions

0
推荐指数
1
解决办法
833
查看次数

在C++中进行类型转换的简短而优雅的方法?

说我想要的大小存储std::vectorint我有以下选项,据我所知:

int size = vector.size(); // Throws an implicit conversion warning
int size = (int)vector.size(); // C like typecasting is discouraged and forbidden in many code standards
int size = static_cast<int>(vector.size()); // This makes me want to gouge my eyes out (it's ugly)
Run Code Online (Sandbox Code Playgroud)

有没有其他选择可以避免上述所有问题?

c++ types casting type-conversion

0
推荐指数
1
解决办法
88
查看次数

OpenCV 最近邻插值创建原始图像中不存在的像素

我有一个图像 A。目标是将其缩小为图像,使图像的尺寸更小,但新图像中的像素不包含原始图像中不存在的值。换句话说,如果 $p \in A'$ 那么 $p \in A$。

我尝试在 python 中执行此操作,如下所示:

resized = cv2.resize(old_img, (1024, 1024), 0, 0, cv2.INTER_NEAREST)
Run Code Online (Sandbox Code Playgroud)

但是,当输入是二值图像(old_img 仅包含黑白像素)时,生成的图像包含灰度值(值不等于 0 或 255)。

这是实现中的错误吗?对我来说,没有像素以非原始值结束是一个硬性要求。

python opencv image image-processing

0
推荐指数
1
解决办法
3624
查看次数

rust 如何对堆栈分配的对象有多个可变引用?

假设我们有这样的 C 代码:

typedef struct A { int i; } A;
typedef struct B { A* a; } B;
typedef struct C { A* a; } C;

int main(void)
{
  A a = { .i = 42 };
  B b = { .a = &a };
  C c = { .a = &a };
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,A 是堆栈分配的,B 和 C 指向 A 所在的堆栈分配的内存。

我需要在 Rust 中做完全相同的事情,但每次我尝试创建多个可变引用时,它都会抱怨。

为了完成如此基本的事情而不得不与语言作斗争,这有点令人沮丧。

c stack pointers rust

-1
推荐指数
1
解决办法
907
查看次数